虽然这个特定实例中的问题涉及 Django 和 Python,但我想这个问题也出现在其他地方。
浮点值存在精度问题,当用于货币时有时会导致不准确,因此在大多数情况下,固定精度 Decimal 是选择的存储类型。
但是,如果价格与非整数数量相结合,例如在发票或收据中,情况又如何呢?假设Fairy Dust每克售价19.99 美元,一位顾客购买了3.5 克这种东西。价格为十进制,数量为浮点数。
那么总数是Decimal(19.99) * float(3.5)
。但不允许将浮点数和小数相乘:
>>> from decimal import *
>>> Decimal(19.99) * float(3.5)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for *: 'Decimal' and 'float'
当然,我们可以先将价格转换为浮点数,但随后我们就会失去通过将值存储为小数而获得的任何优势。或者我们可以将数量存储为小数,但这意味着任意选择数量的范围和精度。但是在设计时,开发人员不一定知道数量需要什么范围/精度(这就是浮点数存在的原因)。有没有更好的办法?
我确定这个问题之前已经解决了;进行此类计算的最佳方法是什么?