Apabila cuba menukar nombor float64 kepada uint64 dalam Go, isu ketepatan boleh timbul. Ini selalunya mengakibatkan tingkah laku yang tidak dijangka, kerana komponen pecahan float64 dibuang semasa penukaran.
Untuk menggambarkan isu:
package main import "fmt" func main() { var n float64 = 6161047830682206209 fmt.Println(uint64(n)) }
Kod ini akan mencetak nilai salah berikut:
6161047830682206208
Masalahnya
Punca masalahnya terletak pada perbezaan antara cara pemalar dan nombor titik terapung diwakili dalam Go. Pemalar diwakili dengan ketepatan arbitrari, manakala nombor titik terapung mengikut piawaian IEEE 754. Ini bermakna walaupun pemalar boleh mewakili nilai tanpa kehilangan ketepatan, nombor titik terapung mempunyai bilangan bit yang terhad (53 untuk float64) tersedia untuk menyimpan digit.
Penyelesaian
Untuk menukar float64 kepada uint64 dengan betul, anda mesti memastikan nombor float64 boleh diwakili dengan tepat dalam 52 bit tersedia. Jika tidak, ketepatan akan hilang. Anda boleh melakukan ini dengan mengesahkan bahawa nilai float64 berada dalam julat uint64 yang boleh diwakili.
Di bawah ialah contoh fungsi yang menyemak kebolehwakilan sebelum menghantar:
func Float64ToUint64(n float64) (uint64, error) { if (n < 0) || (n > math.MaxUint64) { return 0, errors.New("value out of range") } return uint64(n), nil }
Atas ialah kandungan terperinci Bagaimana untuk Menukar float64 kepada uint64 dengan Selamat dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!