![](/img/trans.png)
[英]NodeJS - How to retrieve original data from a Buffer after use JSON.parse(JSON.stringify())
[英]In NodeJS, how to encode a 32 bits float number from a Buffer to a (json) string preserving original precision?
输入是一个包含单精度浮点数(32 位,小端序)的缓冲区。
我想要生成的是包含这些数字的 JSON 字符串,保留完全相同的值而不会更改精度。
问题是:一旦将值存储在 JS number
中,它就会转换为 64 位,从而引入精度变化。
例如:
const buffer = Buffer.from("cdcccc3d", "hex"); // cdcccc3d is 0.1 in 32 bits float LE
console.log(buffer.readFloatLE(0)); // 0.10000000149011612 => bad
如何将此值作为字符串保留原始精度而不进行转换? 这里: "0.1"
。
如果我设法生成一个 JSON 字符串,其中包含具有原始精度的数字: { "value": 0.1 }
,则奖励积分。
小端字节 cd cc cc 3d 按大端顺序为 3d cc cc cd 或位 0011 1101 1100 1100 1100 1100 1100。
在 IEEE-754 binary32 编码中,0 是符号位,011 1101 1 是指数字段位,100 1100 1100 1100 1100 1101 是有效位字段位。
0 符号位表示正数。
指数字段位 011 1101 1 是 123 作为原始二进制。 指数以 127 的偏差编码,因此表示的指数为 123−127 = −4。
由于指数字段不为零(或全一,用于无穷大和 NaN),因此在有效数字字段位前加上 1,形成 1100 1100 1100 1100 1100 1101。作为原始二进制,这是 13,421,773。 有效数字以 2 23的比例编码,因此表示的有效数字为 13,421,773/2 23 。
结合符号、指数和有效数,表示的值为 +2 -4 •13,421,773/2 23 = 0.100000001490116119384765625。 这是表示的准确值,没有错误。 因此,您可以看到为其生成的数字“0.10000000149011612”是准确的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.