如何处理JavaScript中的浮点数精度?

我有以下虚拟测试脚本:

function test(){
    var x = 0.1 * 0.2;
    document.write(x);}test();

这将打印结果0.020000000000000004,只应打印0.02(如果您使用计算器)。据我所知,这是由于浮点乘法精度的误差。

有没有人有一个很好的解决方案,以便在这种情况下,我得到正确的结果0.02?我知道有类似的函数toFixed或舍入将是另一种可能性,但我想真正打印整个数字没有任何切割和舍入。只是想知道你们其中一个人是否有一些漂亮,优雅的解决方案。

当然,否则我会转到大约10位左右。

如何处理JavaScript中的浮点数精度?

炎炎设计
浏览 717回答 4
4回答

阿晨1998

从浮点指南:我该怎么做才能避免这个问题?这取决于你正在做什么样的计算。如果你真的需要你的结果准确地加起来,特别是当你使用钱时:使用特殊的十进制数据类型。如果您只是不想看到所有这些额外的小数位:只需将结果格式化为显示它时固定的小数位数。如果您没有可用的十进制数据类型,则可以选择使用整数,例如完全以美分进行货币计算。但这是更多的工作,并有一些缺点。请注意,第一点仅适用于您确实需要特定的精确十进制行为。大多数人并不需要这样,他们只是因为他们的程序无法正常使用1/10这样的数字而没有意识到如果它以1/3发生它们甚至不会眨眼同样的错误。如果第一点确实适用于您,请使用BigDecimal for JavaScript,这根本不是优雅的,但实际上解决了问题而不是提供不完美的解决方法。

蓝山帝景

我喜欢Pedro Ladaria的解决方案并使用类似的东西。function strip(number) {     return (parseFloat(number).toPrecision(12));}与Pedros解决方案不同,这将向上舍入0.999 ...重复并且在最低有效数字上精确到正/负1。注意:处理32位或64位浮点数时,应使用toPrecision(7)和toPrecision(15)以获得最佳结果。有关原因,请参阅此问题。

慕森卡

你只是在进行乘法运算吗?如果是这样,那么你可以利用一个关于十进制算术的巧妙秘密。就是这样NumberOfDecimals(X) + NumberOfDecimals(Y) = ExpectedNumberOfDecimals。也就是说,如果我们有,0.123 * 0.12那么我们知道将有5个小数位,因为0.123有3个小数位并且0.12有两个。因此,如果JavaScript给了我们一个数字,0.014760000002我们可以安全地舍入到小数点后第五位,而不用担心会失去精度。
打开App,查看更多内容
随时随地看视频慕课网APP