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

为什么JavaScript要在解析后的数字末尾添加一个额外的非零数字,javascript,floating-point,precision,floating-accuracy,Javascript,Floating Point,Precision,Floating Accuracy,当我运行时,Number(123456789012345.12)。toFixed(3),它将以字符串形式返回“123456789012345.125”。小数点后的5是从哪里来的?我希望它返回“123456789012345.120”。我使用Chrome 68版在Mac上使用英特尔处理器执行了此代码。您的数字太长(数字太多),与JavaScript数字的精度不符 以下是使用更少数字的示例: Number(123456789012345.12).toFixed(3): '1234567890123

当我运行时,
Number(123456789012345.12)。toFixed(3)
,它将以字符串形式返回
“123456789012345.125”
。小数点后的5是从哪里来的?我希望它返回
“123456789012345.120”
。我使用Chrome 68版在Mac上使用英特尔处理器执行了此代码。

您的数字太长(数字太多),与JavaScript数字的精度不符

以下是使用更少数字的示例:

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,则可以使用以下方法执行相同操作:

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'

您正面临64位浮点的精度限制。关于这个问题,您有什么文档可以给我指点吗。但为什么是5?浮点格式是二进制的。5是
1/2
(它们并不总是二进制的,但对大多数人来说“总是”是准确的)这是我一直指向人们的参考: