Solution to the infamous 64-bit floating point math error in JavaScript
由于64位浮点表示,是否有解决javascript中臭名昭著的浮点数学错误的方法?浮点运算是否中断?
我试图基于javascript创建一个数学密集型应用程序,但是,由于javascript中的这个错误,它总是导致不准确的输出。
例如:0.1+0.2=30亿而预期是0.1+0.2=0.3
我想知道像Paypal这样的金融组织如何仍然有JavaScript应用程序。
- 这不仅是Javascript的一个常见问题,而且是很多语言的共同问题,这个问题是在binary>非binary转换中,如果没有一个截止点,在"我们的终点"上是无法解决的,你必须做一个截止点。
- 这不是一个错误,而是浮点运算固有的局限性。浮点值仅近似于实数。
- @切普纳,我知道上面的问题("浮点数学坏了吗?")因此我自己引用了它。如果你看到这个问题,你会发现它问,我引用"任何想法,为什么会这样?"但是,我的问题以"是否有解决办法…"开头。因此,这应被视为不重复。我想讨论这个问题的解决办法。
- 该问题的公认答案链接到如何正确使用浮点值的讨论。没有"修正",因为浮点运算没有被破坏。
对(非)错误的"解决方案"是忽略它,并确保使用适当的函数(即toFixed(n)来表示具有所需小数位数的数字。
了解值的内部表示形式与如何向最终用户呈现该值之间的区别是很重要的。
- 问题是,当我的应用程序像科学计算/会计/银行/财务应用程序一样是数学密集型的时候。应用程序必须尽可能精确,并且至少匹配计算器上显示的值。因此,这个问题是相关的。
- @平均来说,四舍五入的"误差"会变平。使用双精度浮点的典型误差与人类头发的宽度相比,与地球绕太阳运行的轨道相当。对于绝大多数根本无足轻重的问题。要获得"计算器精度",只需确保你所呈现的有效数字不超过14个。
- 哦,出于会计的目的,不要使用fp,使用"decimal"类,或者使"unit"值成为最小的货币量,并使用整数,例如表示1美元为"100"
- 但是让我知道如何处理这个问题:x=0.2;y=0.3;z=0.1;console.log(x-y+z)
- @临时console.log((x - y + z).toFixed(14))。
您可以使用https://github.com/ekg/fraction.js库作为中间值,并将最终结果转换回十进制值以最小化错误。