Go で 2.4/0.8 == 3 を取得しようとしています
w:=float64(2.4)
fmt.Println(math.Floor(w/0.8),math.Floor(2.4/0.8) )
それは私に「2 3」を与えます。
問題は、なぜmath.Floor(w/0.8)
3 が得られないかということです。浮動小数点数の精度制限ですか?
Go で 2.4/0.8 == 3 を取得しようとしています
w:=float64(2.4)
fmt.Println(math.Floor(w/0.8),math.Floor(2.4/0.8) )
それは私に「2 3」を与えます。
問題は、なぜmath.Floor(w/0.8)
3 が得られないかということです。浮動小数点数の精度制限ですか?
プログラムの出力は正しいです。IEEE 形式での多くの実数の表現は正確ではありません。最初の数値は実際には (その制限された 64 ビット バージョンでは) 3 未満であるため、floor は正しく '2' を返します。2 つ目は、より高い精度を使用してコンパイル時に計算されます。
推奨読書。
はい、精度の限界です。float64 はかなり正確ですが、2.4 はバイナリで正確に格納することはできません。両方の数値が定数の場合、コンパイル時に計算がより高い精度で実行され、結果が float64 に丸められると、正確に 3 になります。ただし、数値の 1 つが変数の場合、計算を実行する必要があります。実行時に 2.9999999999999996 になり、Floor は 2 に切り捨てます。
これは質問には答えませんが(なぜ)、このページでラウンド関数を探していることがわかりました。
func Round(val float64) (float64) {
if float64(int(val)) < val {
return float64(int(val) + 1)
}
return val
}