为什么 Node.js 自动舍入我的浮点数?

Sag*_*arM 2 javascript floating-point precision node.js

我正在尝试编写一个函数,使用此处的答案作为参考,获取浮点文字中小数点后的小数位数。

尽管在浏览器控制台中尝试时这似乎工作正常,但在 Node.js 环境中运行测试用例时,精度最多仅被截断 14 位。

let data = 123.834756380650877834678
console.log(data) // 123.83475638065088
Run Code Online (Sandbox Code Playgroud)

该函数返回 14 作为答案。

为什么在休息时进行舍入?这是默认行为吗?

Eri*_*hil 5

JavaScript(大概还有 Node.js)中使用的浮点格式是 IEEE-754 binary64。在源代码中使用时123.834756380650877834678,会转换为最接近的可表示值,即 123.834756380650873097692965529859066009521484375。

\n

当将其转换为具有默认格式的字符串时,JavaScript 使用足够的数字来唯一区分该值。对于 123.834756380650873097692965529859066009521484375,这应该生成 \xe2\x80\x9c123.83475638065087\xe2\x80\x9d。如果您得到 \xe2\x80\x9c123.83475638065088\xe2\x80\x9d,其最后一位数字不同,则您使用的软件不符合 JavaScript 规范 (ECMAScript)。

\n

无论如何,binary64 格式都没有足够的精度来保留原始数字 \xe2\x80\x9c123.834756380650877834678\xe2\x80\x9d 小数点后有 21 位数字的信息。

\n

您链接到的代码也不会也无法计算原始数字中的位数。它计算唯一区分转换为binary64 后表示的值所需的位数。对于足够短的数字,小数点后没有尾随零,这与原始数字中小数点后的位数相同。对于其他人来说,情况可能并非如此。

\n