虽然这个特定实例中的问题涉及到Django和Python,但我想这个问题也出现在其他地方。在
浮点值存在精度问题,当用于货币时,有时会导致不准确,因此在大多数情况下,固定精度十进制是首选的存储类型。在
但是,如果价格与非整数数量组合在一起,例如在发票或收据中,该怎么办呢。比如说,仙尘的价格是每克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 "", line 1, in
TypeError: unsupported operand type(s) for *: 'Decimal' and 'float'
当然,我们可以先将价格设为浮动,但这样一来,我们就失去了通过将值存储为十进制而获得的任何优势。或者我们可以将数量存储为十进制,但这意味着可以任意选择数量的范围和精度。但是在设计时,开发人员不必知道这个数量需要多少范围/精度(这就是浮点数存在的原因)。有更好的方法吗?在
我相信这个问题以前已经解决过了;进行这种计算的最佳方法是什么?在