如果我将 float 的精度降低到 8,我在处理货币时会得到正确的数字吗?
If I reduce the precision of float to 8 will I get correct numbers when working with currency?
我知道如果我在计算金钱时使用浮点数,如果结果四舍五入到较低的精度,我将有得到不正确结果的风险,结果不相等吗?
>>> 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
不,不是。浮点数始终具有完整的精度,当您对它们进行任何操作时,不准确会导致问题。此外,主要问题不是准确性有限,而是某些数字无法准确表示这一事实。就像你不能将 1/3 精确地表示为小数一样,你也不能用浮点数来精确地表示一些数字。
如果您对这些数字进行运算,即使您尝试将它们四舍五入到特定位数,也会出现问题。
正确计算货币的唯一方法是使用缩放整数,这在许多语言中都是小数类型。它可以准确地表示其范围内的数字,不会引起问题。
我知道如果我在计算金钱时使用浮点数,如果结果四舍五入到较低的精度,我将有得到不正确结果的风险,结果不相等吗?
>>> 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
不,不是。浮点数始终具有完整的精度,当您对它们进行任何操作时,不准确会导致问题。此外,主要问题不是准确性有限,而是某些数字无法准确表示这一事实。就像你不能将 1/3 精确地表示为小数一样,你也不能用浮点数来精确地表示一些数字。
如果您对这些数字进行运算,即使您尝试将它们四舍五入到特定位数,也会出现问题。
正确计算货币的唯一方法是使用缩放整数,这在许多语言中都是小数类型。它可以准确地表示其范围内的数字,不会引起问题。