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

How to ensure integer division gives out correct results?

本文关键字:结果 何保证 整数 除法      更新时间:2023-09-26

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

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)确实给出了正确的结果,但这当然只是一个例子;将93替换为任意不合适的整数

这种情况会发生吗?如果是这样,有没有办法保证正确的结果?

这种情况会发生吗?

。如果它们是整数(即没有小数部分的浮点数),然后等除,那么结果将是精确的,并且又是整数。
如果不是等除,结果总是大于整数除法的确切结果。你永远不会得到一个应该是32.9999999…号码。浮点结果与可表示的一样精确,舍入不会破坏总的预购顺序。

如果你想要一个精确的整除法结果。然后按

Math.round((m - m%n)/n)

如果两个数相除的值应该是3,那么它将是。如果该值应该是2.999999999999,那么它将是。Java不做某种奇怪的隐藏四舍五入,向上或向下。如果你总是需要让值向下舍入,那么使用Floor(x/y)即使值是2.99999999999999999999999999999999999,它仍然会返回为2。这就是福斯的工作。细胞也是一样。如果该值为3.0000000000000000000001,则该值将被设置为4。我在大学里教过这个,这就是它应该如何工作的