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 サイトの他の関連記事を参照してください。