return 25.0 * (1 + 16.0/100)
これは29.0
を返します。
しかし、int型を使用して()以下のような、この計算でこの結果が返されるのはなぜですか? (Python)
return int(25.0 * (1 + 16.0/100))
これは、それは28の代わりに、29
return 25.0 * (1 + 16.0/100)
これは29.0
を返します。
しかし、int型を使用して()以下のような、この計算でこの結果が返されるのはなぜですか? (Python)
return int(25.0 * (1 + 16.0/100))
これは、それは28の代わりに、29
実際の結果が28.99999999999
のようなものである理由を私は理解していない28
を返します。どのPythonは表示のために29.0
に丸めます。ただし、int
に変換すると、小数点以下の桁が切り捨てられ、28
のままになります。
なぜ、最初の結果はほとんどですが、それほどではありません。29
?バイナリ浮動小数点数計算では、0.16
のように10進数で「いい」数字を正確に表すことができないためです。バイナリでは、これは繰り返し終わることのない部分であり、有限メモリで正確に表現することはできません。
なぜ、正確でない場合はバイナリ浮動小数点数を使用しますか?コンピュータにはハードウェアが搭載されているため、数学は非常に高速で、ほとんどの目的で十分正確です。小数の正確な表現にはDecimal.decimal
クラスを使用できますが、計算が遅くなります。
それは
print 25*(1+16.0/100) - 29
を試してみて、あなたがゼロより小さい非常に非常に小さな数を取得します の問題です。
多分あなたの代わりに、または単に小数点以下を削除するのpythonの整数へのキャストint型
print int(round(25*(1+16.0/100)))
の組み合わせでラウンドを使用する必要があります。丸めた整数値を取得するには、この値がまだ浮動小数点として表現され、整数にキャストされていないので、これは29.0を返します29.
return round(25.0 * (1 + 16.0/100))
を返します
return int(round(25.0 * (1 + 16.0/100)))
を使用することができます。