2 つの float64 の間に不一致があるのはなぜですか?
次の Go スニペットを考えてみましょう:
fmt.Println(912 * 0.01) fmt.Println(float64(912) * 0.01)
正しく理解しながら2 行目には 9.120000000000001 が出力されます。最初の行がなぜ末尾に ...01 を付けずに 9.12 を出力するのか不思議に思うかもしれません。
その答えは、仕様で定義されている Go の定数式の処理にあります。
定数式は常に評価されます。その通り;中間値と定数自体は、言語で事前に宣言された型でサポートされているよりも大幅に大きい精度を必要とする場合があります。
912 * 0.01 は定数式であるため、非常に高い精度で評価されます。この式の結果を引数として fmt.Println() に渡すときも、これと同じ精度が維持されます。本質的に、 fmt.Println(912 * 0.01) は fmt.Println(9.12) であるかのように動作します。9.12 は評価された式の正確な表現です。
対照的に、912 を明示的に float64 にキャストすると、 2 行目では、浮動小数点乗算の両方のオペランドが暗黙的に float64 にキャストされます。 0.01 は float64 では正確に表現できないため、精度の低下が発生し、出力に ...01 が存在します。
したがって、結果の違いは、定数式の評価中に保持される精度と暗黙的な精度に起因します。 float64(912) * 0.01.
に関係するキャスト以上がGo が `912 * 0.01` に対して 9.12 を出力するのに、`float64(912) * 0.01` に対して 9.120000000000001 を出力するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。