通过乘法修复浮点数计算问题,这样做可以吗?

3

我有多个计算中遇到了js中的浮点数问题。 我正在尝试通过将等式的所有部分乘以1000,然后将结果除以1000来修复它。

var a = 16924.83,
    b = 16835.61;

var c = a-b; //outputs 89.22000000000116
var d = (1000*a-1000*b)/1000;  //outputs 89.22 and seems to be working correct

这种方法对于浮点数问题的更正是否可行呢?

我读到了浮点数计算有问题吗?


1
为什么不直接将结果四舍五入到所需的小数位数呢? - user229044
1
最后显示时,请以百分之一为单位并进行比例缩放。 - Raymond Chen
这可能有效,但某些数字组合可能会失败。如果您正在处理货币价值,我建议您存储并使用整数进行计算(即将它们乘以100并修正为零位小数),然后再除以100并重新修正以供显示。 - user1864610
1个回答

1

在乘法后应进行四舍五入:

var d = (Math.round(1000*a)-Math.round(1000*b))/1000;

只是简单地进行乘法运算可能无法解决问题。当您分配时,需要考虑其他因素。
var a = 16924.83;

它可能在内部表示为类似于16924.8300001的东西,因此当你乘以1000时,你会得到16924830.001。你需要四舍五入来消除小数。


我可以使用Math.round(1000a - 1000b)/1000来四舍五入吗?这样做只需要少量的代码,但我不知道是否会有差别。假设没有差别吧? - Prosto Trader
只要在 Math.round 中不添加/减去超过5个变量,我认为这将起作用。对每个变量进行舍入更加普遍适用。 - Barmar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接