ホームページ > バックエンド開発 > Golang > Go の `912 * 0.01` が `float64(912) * 0.01` と異なるのはなぜですか?

Go の `912 * 0.01` が `float64(912) * 0.01` と異なるのはなぜですか?

Linda Hamilton
リリース: 2024-12-16 19:00:15
オリジナル
581 人が閲覧しました

Why Does `912 * 0.01` Differ from `float64(912) * 0.01` in Go?

Float64 精度の違い: さまざまな値のアンパック

Go での次の例を考えてみましょう。

fmt.Println(912 * 0.01)
fmt.Println(float64(912) * 0.01)
ログイン後にコピー

最初のステートメントでは 9.12 が出力されますが、2 番目のステートメントでは次の結果が得られます。 9.120000000000001。この明らかな精度の違いは不可解かもしれません。

Go 言語仕様によれば、定数式は正確に評価されます。この場合、912 * 0.01 が定数式になります。これを正確に評価すると 9.12 が生成され、その後 float64(912 * 0.01) に割り当てられ、fmt.Println() に渡されます。

または、float64(912) * 0.01 も定数式です。ただし、元は整数である左側のオペランドは、乗算の前に明示的に float64 にキャストされます。これは、0.01 も暗黙的に float64 に変換され、2 つの float64 値の間で乗算が行われることを意味します。

重要なことに、0.01 は float64 として正確に表現できません。表現可能な最も近い値に四捨五入されるため、若干の不正確さが生じます。結果として、float64(912) * 0.01 は 9.120000000000001 と評価され、出力されます。

要約すると、出力の違いは定数式の評価から生じます。キャストが評価前に行われるか評価中に行われるかです。そして、float64 の精度の制限により不正確さが導入されるかどうか。

以上がGo の `912 * 0.01` が `float64(912) * 0.01` と異なるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート