2016-02-28 232 views
2

我正面临奇怪的问题。当输入超过16位数字时遇到parseFloat问题

parseFloat(11111111111111111)将其转换为11111111111111112

我注意到,它工作正常,直到length is 16但四舍五入较高时输入length is > 16.

我希望它被执行后保留在parseFloat传递的原始值。

任何帮助?

回答

2

整数(没有周期或指数符号的数字)被认为是精确到15位数。

更多信息here

+0

[您应该阅读此](http://www.w3fools.com/) –

+0

@RajaprabhuAravindasamy感谢您的建议,我明白了。 –

1

号码以JavaScript使用的是64位浮点值来表示(因此在其他语言称为doubles)。

doubles最多可容纳15/16位有效数字(取决于数字大小)。由于double的范围是1.7E +/- 308,因此某些数字只能被double约束,在您的情况下,11111111111111111不能完全表示,但会被11111111111111112的值约束。如果这听起来很奇怪,那么记住0.3不能完全表示为双重。

double可以在范围+/- 2^53中保持精确的整数值,当您在此范围内操作时 - 您可能会得到确切的值。

0

尝试使用一元运算符+。 +(“1111111111111111”)+ 1 = 1111111111111112

0

正如您在following blog post中看到的,JavaScript仅支持53位整数。

,如果你在控制台输入 var x = 11111111111111111 然后键入 x 你会得到 11111111111111112 这有什么好做的parseFloat方法。

还有一个相关问题here关于在JavaScript中使用大数字。

1

Javascript有一个常量,Number.MAX_SAFE_INTEGER这是可以精确表示的最高整数。

本文中的安全性指的是准确表示整数并正确比较它们的能力。例如,Number.MAX_SAFE_INTEGER + 1 === Number.MAX_SAFE_INTEGER + 2将评估为true,这在数学上不正确。

该值为9007199254740991(2^53 - 1),它使最多15个数字安全。