Menukar nombor titik terapung (float64) kepada integer (int) dalam Go boleh membawa kepada keputusan yang tidak dijangka disebabkan oleh had titik terapung perwakilan.
Nombor perpuluhan seperti 100.55 tidak boleh diwakili dengan tepat menggunakan bilangan bit terhingga dalam binari, perwakilan dalaman yang digunakan oleh komputer. Nilai Float64 dalam Go mematuhi piawaian IEEE-754, yang menggunakan 53 bit untuk bahagian pecahan. Ini bermakna 100.55 dianggarkan kepada nombor perduaan boleh diwakili terdekat, yang membawa kepada sedikit percanggahan.
Pertimbangkan kod berikut:
package main import "fmt" func main() { x := 100.55 fmt.Println(x - float64(int(x))) }
Menjalankan kod ini akan mencetak :
0.5499999999999972
bukan yang diharapkan 0.55.
Pemformat Rentetan (fmt.Printf)
Satu cara untuk mengendalikan percanggahan ini ialah dengan membundarkan nombor titik terapung kepada ketepatan yang dikehendaki sebelum mencetak.
package main import "fmt" func main() { x := 100.55 fmt.Printf("%.2f\n", x) }
Kod ini cetakan:
0.55
Perwakilan Bukan Titik Terapung
Pendekatan lain ialah mengelak daripada menggunakan nombor titik terapung sama sekali. Contohnya, untuk mewakili jumlah dolar, anda boleh menggunakan sen sebagai integer dan skala sebanyak 100 apabila dipaparkan.
cents := 10055 fmt.Printf("%d.%d $\n", cents/100, cents%100)
Kod ini mencetak:
100.55 $
Atas ialah kandungan terperinci Mengapakah Penukaran float64 kepada int dalam Go Menghasilkan Keputusan Yang Tidak Dijangka?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!