Decimal.js乘法方法无法正常工作

时间:2019-08-25 11:58:42

标签: javascript floating-point precision 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,但是得到了。我是否缺少某些东西,或者它是库的问题,因为我有点困惑,因为它不能与针对此类问题创建的库一起使用。

1 个答案:

答案 0 :(得分:2)

您的计算器和您的库都在四舍五入。

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

您缺少的是舍入错误并非二进制浮点独有。任何基数X分数表示形式(包括十进制)都只能精确表示其分母可以由X表示的有理数。对于十进制,X为十,而1/6不能完全表示为A / 10 B 对于任何一对整数A和B。

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