当输入超过16位时,面临parseFloat的问题

时间:2016-02-28 10:04:51

标签: javascript

我面临着奇怪的问题。

parseFloat(11111111111111111)将其转换为11111111111111112

我注意到它在length is 16之前工作正常,但在输入length is > 16.

时会更高

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

任何帮助?

6 个答案:

答案 0 :(得分:2)

  

整数(没有句号或指数表示法的数字)被认为是最准确的15位数。

更多信息here

答案 1 :(得分:1)

javascript中的数字使用64位浮点值表示(在其他语言中称为doubles)。

doubles最多可以保留15/16位有效数字(取决于数字大小)。由于double的范围是1.7E +/- 308,因此某些数字只能通过double进行近似,在您的情况下,11111111111111111无法准确表示但是通过11111111111111112值进行近似。如果这听起来很奇怪,那么请记住,0.3也不能完全表示为双倍。

当您在此范围内操作时,

double可以保持范围+/- 2 ^ 53中的精确整数值 - 您可能需要精确值。

答案 2 :(得分:1)

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

  

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

值为9007199254740991(2 ^ 53 - 1),最多可保证15位数。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

如果您输入控制台      var x = 11111111111111111 然后输入     x 你会得到的     11111111111111112 这与parseFloat方法无关。

还有一个关于在JavaScript中处理大数字的相关问题here

答案 5 :(得分:0)

  • JavaScript现在具有BigInt
  

BigInt是一个内置对象,它提供了一种表示大于253-1的整数的方法,这是JavaScript可以使用Number原语可靠地表示的最大数字。

     

BigInt可用于任意大的整数。