【问题标题】:javascript Addition creates weird decimal issue [duplicate]javascript加法会产生奇怪的小数问题[重复]
【发布时间】:2011-11-02 03:24:36
【问题描述】:

可能重复:
Elegant workaround for JavaScript floating point number problem

为什么使用javascript将两个数字相加时,会返回一个疯狂的小数点?

如果我在纸上加上 285.72 + 142.86 等于 428.58,你会用计算器得到相同的答案。

但是,如果我从 2 个文本框中添加该数字,它会返回 428.58000000000004

Example

我需要我的 javascript 来返回 428.58。我知道我可以使用 .toFixed(),但我不想这样做,因为我不明白为什么将两个数字加在一起会在小数点后产生如此疯狂的位数。

【问题讨论】:

  • 啊,很好的浮点数学。
  • 感谢 Marc B,找不到其他帖子,它为我指明了正确的方向。通过floating-point-gui.de/basic这篇文章的链接,我忘记了学校的浮点主题。

标签: javascript decimal addition


【解决方案1】:

您必须使用 .toFixed,因为 Javascript 使用 IEEE 754-2008 浮点算术会导致此行为。这些二进制浮点数只是近似值,因此您必须使用舍入。

【讨论】:

    【解决方案2】:

    这是因为浮点数不使用某些十进制数的精确表示,因此可能会出现算术不精确。除了将数字四舍五入到您需要的任何精度之外,我不知道有什么更好的方法,例如toFixed 所做的

    http://www.mredkj.com/javascript/nfbasic2.html

    【讨论】:

      【解决方案3】:

      并非所有数字都可以精确地以浮点数表示。进行近似计算,当您对不精确的数字进行一次又一次的操作时,情况会变得更糟。

      有关示例,请参阅此 Wikipedia 条目: http://en.wikipedia.org/wiki/Floating_point#Accuracy_problems

      如果您将加法输入更改为可以用浮点精确表示的内容(例如 1/8),它会起作用。试试数字:285.125 和 142.125。

      Microsoft .NET 也有类似的行为:

      float x = 285.72f
      
      float y = 142.86f
      
      float z = x + y
      

      结果: z = 428.580017

      【讨论】:

      • 好点,这不仅仅是 JS 的问题。
      猜你喜欢
      • 2019-11-30
      • 2013-03-15
      • 1970-01-01
      • 2023-03-25
      • 1970-01-01
      • 2023-04-03
      • 2015-02-26
      • 1970-01-01
      相关资源
      最近更新 更多