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

时间:2018-08-29 23:44:35

标签: javascript floating-point precision floating-accuracy

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

1 个答案:

答案 0 :(得分:1)

您的号码太长(位数太多),不符合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'