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

Javascript 如何确保整数除法给出正确的结果?,javascript,floating-accuracy,integer-division,Javascript,Floating Accuracy,Integer Division,我知道浮点计算可能不准确。例如: var x = 100*0.333; 这里x被设置为33.3000000000000004,而不是33。这似乎是一个小问题,但如果涉及四舍五入,问题会变得严重。例如,Math.ceil(x)将不正确-将产生34而不是33 问题是,有人告诉我JS对整数和浮点没有多大区别。所以我开始担心是否有任何方法可以确保积分除法是正确的 JS中整数除法的常用公式似乎是Math.floor(n/m),其中n,m是整数。现在让我们假设m平均地除以n。由于JS将每个数字视为一个浮点

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

var x = 100*0.333;
这里x被设置为
33.3000000000000004
,而不是
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.999999999999
而不是
3
,那么
Math.floor(9/3)
将错误地产生
2
而不是
3
。实际上,
Math.floor(9/3)
确实给出了正确的结果,但这当然只是一个例子;用任何不幸的整数选择替换
9
3

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

这种情况会发生吗

否。如果它们是整数(即不含小数部分的浮点数)并被等分,则结果将是精确的,并且再次是整数。

如果不是等分,结果将始终大于整数除法的精确结果。你永远不会得到一个本应是
3
2.999999…
号码。浮点结果尽可能精确,四舍五入不会破坏总的前序。

如果将两个数字相除的值设为3,则将是。如果该值应为2.9999999999,则为。Java不会做一些奇怪的隐藏取整,向上或向下。如果您总是需要将该值向下舍入,则使用地板(x/y),即使该值为2.999999999999999999999999999999999999999999999999,它仍将返回为2。地板就是这样做的。和celling一样。如果该值为3.0000000000000001,则将其设置为4。我在大学里教这门课,这就是它的工作原理。

如果你想要一个精确的整数除法结果。那就这样做吧

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

JavaScript中的所有数字都是双精度浮点数。您是否会使用
Math.round(2.99999999999)
而不是Math.floor?@forgetso Nope。我要整数除法,这是四舍五入。例如,我想从
23/4
获取
5
,而不是
6
。我希望
Math.floor(n/m)
能给我正确的结果,不管
n
m
是否能被平均整除。但是
Math.round()
会舍入到最接近的整数,所以在你假设的例子中它会给你正确的结果。如果结果应该是一个整数,但它与整数相差一点点-或者大一点,或者小一点-那么
Math.round()
就可以了。@Pointy肯定是的,但是在其他情况下,我会得到不想要的结果,比如
23/4
。。。我真的需要把结果四舍五入。你的陈述有证据或来源吗?你有证据或数学证据吗?