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
。。。我真的需要把结果四舍五入。你的陈述有证据或来源吗?你有证据或数学证据吗?