在 NodeJS 中,如何将缓冲区中的 32 位浮点数编码为 (json) 字符串并保留原​​始精度?

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 1101。

在IEEE-754 binary32编码中,0为符号位,011 1101 1为指数位,100 1100 1100 1100 1100 1101为有效位。

0 符号位表示正。

指数字段位 011 1101 1 是 123 作为原始二进制。指数以 127 的偏差编码,因此表示的指数为 123−127 = −4.

由于指数字段不为零(或全部为 1,用于无穷大和 NaN),因此在有效数字字段位前加上 1,形成 1100 1100 1100 1100 1100 1101。作为原始二进制,这是13,421,773。有效数以 223 的比例进行编码,因此表示的有效数为 13,421,773/223.

组合符号、指数和尾数,表示的值为+2−4•13,421,773/223 = 0.100000001490116119384765625。这是表示的准确值,没有错误。所以你可以看到为它生成的数字“0.10000000149011612”就目前而言是准确的。