虽然这个特定实例中的问题涉及Django和Python,但我想这个问题也出现在其他地方。
浮点值存在精度问题,当用于货币时有时会导致不准确,因此固定精度十进制是大多数情况下选择的存储类型。
但是如果价格与非整数数量相结合,例如在发票或收据中。说 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'
当然,我们可以首先将价格转换为浮动价格,但是我们会失去通过将值存储为小数而获得的任何优势。或者我们可以将数量存储为小数,但这意味着任意选择数量的范围和精度。但在设计时,开发人员不一定知道数量所需的范围/精度(这就是存在浮点数的原因)。还有更好的方法吗?
我确信此问题已经解决过;这种计算的最佳方式是什么?
答案 0 :(得分:5)