Rumah > pembangunan bahagian belakang > Golang > Mengapakah Penukaran float64 kepada int dalam Go Menghasilkan Keputusan Yang Tidak Dijangka?

Mengapakah Penukaran float64 kepada int dalam Go Menghasilkan Keputusan Yang Tidak Dijangka?

Patricia Arquette
Lepaskan: 2024-12-14 22:11:12
asal
747 orang telah melayarinya

Why Does Converting float64 to int in Go Produce Unexpected Results?

Ralat Menukar float64 kepada int dalam Go

Pengenalan

Menukar nombor titik terapung (float64) kepada integer (int) dalam Go boleh membawa kepada keputusan yang tidak dijangka disebabkan oleh had titik terapung perwakilan.

Memahami Masalah

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.

Contoh

Pertimbangkan kod berikut:

package main

import "fmt"

func main() {
    x := 100.55
    fmt.Println(x - float64(int(x)))
}
Salin selepas log masuk

Menjalankan kod ini akan mencetak :

0.5499999999999972
Salin selepas log masuk

bukan yang diharapkan 0.55.

Penyelesaian

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)
}
Salin selepas log masuk

Kod ini cetakan:

0.55
Salin selepas log masuk

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)
Salin selepas log masuk

Kod ini mencetak:

100.55 $
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan