この特定のインスタンスの問題は Django と Python を扱っていますが、この問題は他の場所でも発生していると思います。
浮動小数点値には精度の問題があり、通貨に使用すると不正確になることがあるため、ほとんどの場合、固定精度の Decimal が最適なストレージ タイプです。
しかし、請求書や領収書など、価格が整数以外の数量と組み合わされている場合はどうでしょうか。Fairy Dustの価格が1 グラムあたり 19.99 ドルで、顧客が3.5 グラムのものを購入するとします。価格は小数ですが、数量は浮動小数です。
そのときの合計は ですDecimal(19.99) * float(3.5)
。ただし、float と Decimals の乗算は許可されていません。
>>> 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'
もちろん、最初に価格を float にキャストすることもできます。または、数量を 10 進数として格納することもできますが、それは数量の範囲と精度を任意に選択することを意味します。しかし、設計時には、開発者は数量に必要な範囲/精度を必ずしも知っているとは限りません(これが浮動小数点数が存在する理由です)。より良い方法はありますか?
この問題は以前に解決されているはずです。このタイプの計算を行う最適な方法は何ですか?