5

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 が得られないかということです。浮動小数点数の精度制限ですか?

4

3 に答える 3

9

プログラムの出力は正しいです。IEEE 形式での多くの実数の表現は正確ではありません。最初の数値は実際には (その制限された 64 ビット バージョンでは) 3 未満であるため、floor は正しく '2' を返します。2 つ目は、より高い精度を使用してコンパイル時に計算されます。

推奨読書

于 2013-03-11T15:46:37.653 に答える
7

はい、精度の限界です。float64 はかなり正確ですが、2.4 はバイナリで正確に格納することはできません。両方の数値が定数の場合、コンパイル時に計算がより高い精度で実行され、結果が float64 に丸められると、正確に 3 になります。ただし、数値の 1 つが変数の場合、計算を実行する必要があります。実行時に 2.9999999999999996 になり、Floor は 2 に切り捨てます。

于 2013-03-11T16:12:52.463 に答える
-1

これは質問には答えませんが(なぜ)、このページでラウンド関数を探していることがわかりました。

   func Round(val float64) (float64) {
        if float64(int(val)) < val {
            return float64(int(val) + 1)
        }
        return val
    }
于 2014-07-24T08:08:39.513 に答える