【问题标题】:Weird issue with numbers in Javascript [duplicate]Javascript中数字的奇怪问题[重复]
【发布时间】:2018-08-21 11:44:56
【问题描述】:

信息

Number.MAX_SAFE_INTEGER = 9007199254740991link

问题

1000000000000 === 999999999999.999999  // Gives output true
1000000000000 === 999999999999.99999   // Gives output true
1000000000000 === 999999999999.9999    // Gives output false

知道为什么会这样吗?

【问题讨论】:

  • 简而言之:永远不要期望任何特定的浮点数完全等于任何其他数字。是的,如果你深入研究它,你可能会弄清楚这里到底发生了什么,但是当你一开始就违反了使用不准确浮点数的基本原则时,为什么还要打扰呢?
  • 我可以理解为什么浮点运算(如加法)会失败。但是为什么像平等这样的事情会失败呢? (0.1 + 0.2) === 0.3 // gives false 有道理。但不是这个。
  • 如果一个值根本不能用浮点数精确表示,它会捕捉到另一个接近 可以 表示的值。这里前两个数字向上取整为1000000000000,仅仅是因为试图表达它们。
  • 当十进制数字转换为 JavaScript Number 时,结果是十进制数字表示的数字四舍五入到浮点数表示的最接近的值。对于“999999999999.99999”和“999999999999.99999”,最接近的可表示值为1000000000000。所以源代码中的999999999999.99999变为1000000000000,然后比较相等性是比较1000000000000和100000000在“999999999999.9999”的情况下,最接近的值是999999999999.9998779296875,所以比较返回false。

标签: javascript floating-point precision


【解决方案1】:

因为浮点数的精度很低。

http://en.wikipedia.org/wiki/Floating-point

【讨论】:

  • 64 位浮点数比 32 位整数具有更高的精度。 本身导致浮点舍入问题的不是精度程度,而是它们与人们预期相比的行为方式的性质。
  • 好吧,小数是以 10 为底,而计算机以 2 为底工作,也许我在使用“精度”一词时错误地表述了自己。
猜你喜欢
  • 2011-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-25
  • 2021-08-16
  • 2012-09-21
  • 1970-01-01
相关资源
最近更新 更多