首页 > 解决方案 > Decimal.js 乘法方法不能正常工作

问题描述

我遇到了 JavaScript 中的浮点精度问题,为了解决这个问题,我找到了 Decimal.js 或 BigNumber.js 之类的库。在我尝试以下方法之前,它对我来说工作正常。

我一共有60个,份额10个。所以份额的百分比是10/60*100(16.666666666666666667%)。

现在我想知道 360 的 16.666666666666666667% 是 60(计算器),但由于某种原因,我使用 Decimal.js 得到 60.000000000000000001。

var percentage = (Decimal(10).div(60)).mul(100); 
console.log(percentage.toString()); // 16.666666666666666667

var share = (Decimal(360).mul(percentage)).div(100);
console.log(share.toString()); // 60.000000000000000001

我预计会得到 60,但得到了这个。我是遗漏了什么还是图书馆的问题,因为我有点困惑,这不适用于为此类问题创建的图书馆。

标签: javascriptfloating-pointprecisiondecimal.js

解决方案


你的计算器和你的图书馆都是四舍五入的。

将 16.666666666666666667 乘以 60 的确切结果是 1000.00000000000000002。如果手动将 166.66666666666666667 乘以 6,则从 6*7 = 2 开始,进位为 4。之后,当您向左工作时,您将乘以 6 * 6,进位为 4。结果为 0,进位为 4。最后 6*1+4 为 0,进位为 1。

您缺少的是舍入误差不是二进制浮点所独有的。任何 radix X 分数表示,包括小数,只能精确表示其分母可以是 X 的幂的有理数。对于小数,X 是 10,对于任何整数对 A和 1/6 不能精确表示为 A/10 B B.

除非你去一个通用的有理数库,否则你必须处理舍入误差。即使是可以表示任何有理数(仅受内存限制)的库,也必须舍入无理数,例如大多数平方根。


推荐阅读