javascript - 为什么 JavaScript 在解析数字的末尾添加一个额外的非零数字

标签 javascript floating-point precision floating-accuracy

当我运行 Number(123456789012345.12).toFixed(3) 时,它以字符串形式返回 "123456789012345.125" 。最后一个5(十进制)来自哪里?我本来期望它返回“123456789012345.120”。我在配备 Intel 处理器的 Mac 上使用 Chrome 版本 68 执行了此代码。

最佳答案

您的数字太长(位数太多),不符合 JavaScript 数字的 64-bit floating point 精度。

下面是使用较少数字的示例:

Number(123456789012345.12).toFixed(3):  '123456789012345.125'
Number(12345678901234.12).toFixed(3):    '12345678901234.119'
Number(1234567890123.12).toFixed(3):      '1234567890123.120'
Number(123456789012.12).toFixed(3):        '123456789012.120'
Number(12345678901.12).toFixed(3):          '12345678901.120'

JavaScript 数字由 64 位浮点值表示。

不可能使用普通的 JavaScript 数字来表示您显示的数字。您需要实现类似 bignumber.js 的东西。

如果使用 bignumber.js,那么您可以使用以下命令执行相同操作:

let BigNumber = require('bignumber.js');
BigNumber('123456789012345.12').toFixed(3):  '123456789012345.120'
BigNumber('12345678901234.12').toFixed(3):    '12345678901234.120'
BigNumber('1234567890123.12').toFixed(3):      '1234567890123.120'
BigNumber('123456789012.12').toFixed(3):        '123456789012.120'

关于javascript - 为什么 JavaScript 在解析数字的末尾添加一个额外的非零数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52087444/

相关文章:

Swift 的小数精度问题

javascript - 单击事件不正确地更改同一类型的所有 React 组件

javascript - 当输入类型文本小于 0 或大于 24 时,如何禁用输入类型按钮?

php - textarea根据内容js或jquery设置高度

floating-point - 当 β = 10 且 p = 3 时,为什么 9.0 + 4.53 + 4.53 会得到 9.05?

java - 在 JDBC 插入中用随机数填充的 BigDecimal 变量

javascript - 将 textarea1 复制并删除到另一个 textarea2。已经工作

sql - 模数(%)适用于十进制数据类型,但不适用于 float 或实数。为什么?

math - 如何减去 IEEE 754 数字?

c++ - ostream 相当于 %.2f 或 %.2lf