如何确保整数除法给出正确的结果?

问题描述 投票:1回答:3

我知道浮点计算可能不准确的事实。例如:

var x = 100*0.333;

这里x设置为33.300000000000004,而不是33。这似乎是一个小问题,但是如果涉及到四舍五入就变得很严重。例如,Math.ceil(x)将不正确-将产生34而不是33

问题是,有人告诉我JS在整数和浮点数之间没有太大区别。因此,我担心是否有任何方法可以确保整数除法正确。

[JS中整数除法的常用公式似乎是Math.floor(n/m),其中nm是整数。因此,现在让我们说m均分n。由于JS将每个数字都视为一个浮点数,因此n/m将返回一个浮点数。如果此浮点数不精确,但比实际计算结果小一点,则Math.floor(n/m)将四舍五入至比其实际值低一个整数。

[说明:例如,如果9/3产生2.999999999999999而不是3,则Math.floor(9/3)将错误地产生2而不是3。嗯,实际上,Math.floor(9/3)确实给出了正确的结果,但这当然只是一个例子;用任何不幸的整数替换93

会发生这种情况吗?如果是这样,有什么方法可以确保正确的结果?

javascript floating-accuracy integer-division
3个回答
3
投票

会发生这种情况吗?

没有如果它们是整数(即不带小数部分的浮点数)并平均除,则结果将是精确的,并且再次是整数。如果不平均除,结果将始终大于整数除的精确结果。您永远不会得到应该为2.9999999…3数字。浮点结果尽可能精确,可舍入不会破坏总的预排序。


0
投票

如果将两个数相除的值应该是3,那么它将是3。如果该值应为2.999999999999,则为。 Java不会进行某种奇怪的隐藏向上或向下取整。如果您始终需要将值四舍五入,则请使用Floor(x / y),即使该值为2.999999999999999999999999999999999999999,它仍然会返回2。这就是Floor所做的。与单元格相同。如果该值是3.0000000000000000000001,那么它将被设置为4。我在大学里教过这,这是它应该如何工作的方法。


0
投票

如果您想获得精确的整数除法结果。然后执行此操作

Math.round((m - m%n)/n)
© www.soinside.com 2019 - 2024. All rights reserved.