我正面临奇怪的问题。当输入超过16位数字时遇到parseFloat问题
parseFloat(11111111111111111)
将其转换为11111111111111112
。
我注意到,它工作正常,直到length is 16
但四舍五入较高时输入length is > 16.
我希望它被执行后保留在parseFloat
传递的原始值。
任何帮助?
我正面临奇怪的问题。当输入超过16位数字时遇到parseFloat问题
parseFloat(11111111111111111)
将其转换为11111111111111112
。
我注意到,它工作正常,直到length is 16
但四舍五入较高时输入length is > 16.
我希望它被执行后保留在parseFloat
传递的原始值。
任何帮助?
整数(没有周期或指数符号的数字)被认为是精确到15位数。
更多信息here
号码以JavaScript使用的是64位浮点值来表示(因此在其他语言称为doubles
)。
doubles
最多可容纳15/16位有效数字(取决于数字大小)。由于double的范围是1.7E +/- 308,因此某些数字只能被double
约束,在您的情况下,11111111111111111不能完全表示,但会被11111111111111112的值约束。如果这听起来很奇怪,那么记住0.3不能完全表示为双重。
double
可以在范围+/- 2^53中保持精确的整数值,当您在此范围内操作时 - 您可能会得到确切的值。
尝试使用一元运算符+
。 +(“1111111111111111”)+ 1 = 1111111111111112
正如您在following blog post中看到的,JavaScript仅支持53位整数。
,如果你在控制台输入 var x = 11111111111111111
然后键入 x
你会得到 11111111111111112
这有什么好做的parseFloat
方法。
还有一个相关问题here关于在JavaScript中使用大数字。
Javascript有一个常量,Number.MAX_SAFE_INTEGER这是可以精确表示的最高整数。
本文中的安全性指的是准确表示整数并正确比较它们的能力。例如,Number.MAX_SAFE_INTEGER + 1 === Number.MAX_SAFE_INTEGER + 2将评估为true,这在数学上不正确。
该值为9007199254740991(2^53 - 1),它使最多15个数字安全。
[您应该阅读此](http://www.w3fools.com/) –
@RajaprabhuAravindasamy感谢您的建议,我明白了。 –