我知道浮点计算很可能是不准确的。例如:
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
替换为任意不合适的整数
这种情况会发生吗?如果是这样,有没有办法保证正确的结果?
这种情况会发生吗?
。如果它们是整数(即没有小数部分的浮点数),然后等除,那么结果将是精确的,并且又是整数。
如果不是等除,结果总是大于整数除法的确切结果。你永远不会得到一个应该是3
的2.9999999…
号码。浮点结果与可表示的一样精确,舍入不会破坏总的预购顺序。
如果你想要一个精确的整除法结果。然后按
Math.round((m - m%n)/n)
如果两个数相除的值应该是3,那么它将是。如果该值应该是2.999999999999,那么它将是。Java不做某种奇怪的隐藏四舍五入,向上或向下。如果你总是需要让值向下舍入,那么使用Floor(x/y)即使值是2.99999999999999999999999999999999999,它仍然会返回为2。这就是福斯的工作。细胞也是一样。如果该值为3.0000000000000000000001,则该值将被设置为4。我在大学里教过这个,这就是它应该如何工作的