Pythonは倍精度浮動小数点数を使用して小数を格納するためです。Pythonで使用されるIEEE754標準(52M / 11E / 1S)では、8バイトの64ビットストレージスペースには、浮動小数点数の有効桁を格納するために52ビット、指数を格納するために11ビット、および1が割り当てられます。科学的記数法形式のバイナリバージョンである記号を格納するビット。有効数字52桁が多いように見えますが、問題は、有理数を表すときに2進数が無限ループになりやすいことです。それらの多くは、10進数の1/10など、10進数で制限されており、10進数で0.1と簡単に記述できますが、2進数では、0.0001100110011001100110011001100110011001100110011001 ...(以下はすべて1001サイクル)と記述する必要があります。 。浮動小数点数は有効数字が52桁しかないため、53桁目から四捨五入されます。これにより、タイトルに記載されている「浮動小数点精度の低下」の問題が発生しました。四捨五入のルールは「0四捨五入1」なので、少し大きい場合と少し小さい場合があります。
例えば:
print(350*1.4)
結果は次のとおりです:489.99999999999994
コードの改善:
import decimal
a = decimal.Decimal('350')
b = decimal.Decimal('1.4')
c = a * b
print(c)
結果は次のとおりです:490.0