我知道如果我在计算金钱时使用浮动数字,如果结果四舍五入到较低的精度,我将有可能得到不正确的结果,结果是否相等?
>>> 234042163/(2**24)
13.949999988079071
>>> (Decimal("234042163")/(Decimal("2")**Decimal("24")))
Decimal('13.949999988079071044921875')
>>> (Decimal("234042163")/(Decimal("2")**Decimal("24"))).quantize(Decimal("1.00000000"))
Decimal('13.94999999')
>>> round(234042163/(2**24), 8)
13.94999999
答案 0 :(得分:1)
不,不是。浮点数始终具有完全精度,当您对它们执行任何操作时,不准确性将导致问题。此外,主要问题不是准确性有限,而是有些数字无法准确表示。就像你不能准确地将1/3精确地表示为十进制一样,你不能用浮点数准确地表示一些数字。
如果使用这些数字执行操作,即使您尝试将它们舍入到一定数量的数字,也会出现问题。
进行正确货币计算的唯一方法是使用缩放整数,这意味着许多语言中的十进制类型。它可以准确地表示其范围内的数字,不会引起问题。