我知道浮点计算可能不准确的事实。例如:
var x = 100*0.333;
这里x设置为33.300000000000004
,而不是33
。这似乎是一个小问题,但是如果涉及到四舍五入就变得很严重。例如,Math.ceil(x)
将不正确-将产生34
而不是33
。
问题是,有人告诉我JS在整数和浮点数之间没有太大区别。因此,我担心是否有任何方法可以确保整数除法正确。
[JS中整数除法的常用公式似乎是Math.floor(n/m)
,其中n
,m
是整数。因此,现在让我们说m
均分n
。由于JS将每个数字都视为一个浮点数,因此n/m
将返回一个浮点数。如果此浮点数不精确,但比实际计算结果小一点,则Math.floor(n/m)
将四舍五入至比其实际值低一个整数。
[说明:例如,如果9/3
产生2.999999999999999
而不是3
,则Math.floor(9/3)
将错误地产生2
而不是3
。嗯,实际上,Math.floor(9/3)
确实给出了正确的结果,但这当然只是一个例子;用任何不幸的整数替换9
和3
。
会发生这种情况吗?如果是这样,有什么方法可以确保正确的结果?
会发生这种情况吗?
没有如果它们是整数(即不带小数部分的浮点数)并平均除,则结果将是精确的,并且再次是整数。如果不平均除,结果将始终大于整数除的精确结果。您永远不会得到应该为2.9999999…
的3
数字。浮点结果尽可能精确,可舍入不会破坏总的预排序。
如果将两个数相除的值应该是3,那么它将是3。如果该值应为2.999999999999,则为。 Java不会进行某种奇怪的隐藏向上或向下取整。如果您始终需要将值四舍五入,则请使用Floor(x / y),即使该值为2.999999999999999999999999999999999999999,它仍然会返回2。这就是Floor所做的。与单元格相同。如果该值是3.0000000000000000000001,那么它将被设置为4。我在大学里教过这,这是它应该如何工作的方法。
如果您想获得精确的整数除法结果。然后执行此操作
Math.round((m - m%n)/n)