これら 2 つの float64 の値が異なるのはなぜですか?
はじめに
floating を使用する場合- ポイント数については、精度の制限を理解することが不可欠です。次の Go コードを考えてみましょう:
fmt.Println(912 * 0.01) fmt.Println(float64(912) * 0.01)
(Go Playground リンク)
2 行目は、浮動小数点精度の制限により、予想される結果「9.120000000000001」を生成します。
質問
しかし、最初の行は、末尾の精度なしで「9.12」を出力します。ここで疑問が生じます: なぜ Go は 2 つの型なし定数に対して浮動小数点乗算を実行してから、それらを 9.12 リテラルに変換しないのですか?
回答
によるとGo 言語仕様では、定数式は正確に評価されます。したがって、「912 * 0.01」は正確に評価され、これは「9.12」と同じです。
最初のオペランドを float64 (float64(912)) に型キャストすると、他のオペランド (0.01) も同様に評価されます。暗黙的に float64 に型キャストします。 0.01 は float64 で正確に表現できないため、最初の例とは異なる場所で精度が失われます。これは、さまざまな入力式で fmt.Println() を使用したときに観察されるさまざまな結果を説明しています。
以上がGo の型なし浮動小数点乗算と型付き浮動小数点乗算で異なる結果が生成されるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。