Go で浮動小数点数 (float64) を整数 (int) に変換すると、次のような問題が発生する可能性があります。浮動小数点表現の制限により、予期しない結果が生じる可能性があります。
100.55 のような 10 進数は、コンピューターで使用される内部表現である 2 進数の有限ビットを使用して正確に表現できません。 Go の Float64 値は、小数部に 53 ビットを使用する IEEE-754 標準に準拠しています。これは、100.55 が最も近い表現可能な 2 進数に近似されることを意味し、わずかな差異が生じます。
次のコードを考えてみましょう:
package main import "fmt" func main() { x := 100.55 fmt.Println(x - float64(int(x))) }
このコードを実行すると、出力されます。 :
0.5499999999999972
の代わりに0.55.
文字列フォーマッタ (fmt.Printf)
この不一致を処理する 1 つの方法は、印刷前に浮動小数点数を必要な精度に丸めることです。
package main import "fmt" func main() { x := 100.55 fmt.Printf("%.2f\n", x) }
このコードprints:
0.55
非浮動小数点表現
もう 1 つのアプローチは、浮動小数点数の使用を完全に避けることです。たとえば、ドル金額を表すには、セントを整数として使用し、表示時に 100 単位でスケールすることができます。
cents := 10055 fmt.Printf("%d.%d $\n", cents/100, cents%100)
このコードは次のように出力します。
100.55 $
以上がGo で float64 を int に変換すると予期しない結果が生じるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。