Beim Versuch, eine float64-Zahl in eine uint64-Zahl in Go umzuwandeln, können Präzisionsprobleme auftreten. Dies führt oft zu unerwartetem Verhalten, da die Bruchkomponente von float64 während der Konvertierung verworfen wird.
Zur Veranschaulichung des Problems:
package main import "fmt" func main() { var n float64 = 6161047830682206209 fmt.Println(uint64(n)) }
Dieser Code gibt den folgenden falschen Wert aus:
6161047830682206208
Das Problem
Die Wurzel des Problems liegt in den Unterschieden zwischen den Wie-Konstanten und Gleitkommazahlen werden in Go dargestellt. Konstanten werden mit beliebiger Genauigkeit dargestellt, während Gleitkommazahlen dem IEEE 754-Standard folgen. Das bedeutet, dass Konstanten zwar Werte ohne Präzisionsverlust darstellen können, Gleitkommazahlen jedoch nur über eine begrenzte Anzahl von Bits (53 für float64) zum Speichern von Ziffern verfügen.
Die Lösung
Um ein float64 korrekt in ein uint64 umzuwandeln, müssen Sie sicherstellen, dass die float64-Zahl innerhalb der verfügbaren 52 Bits präzise dargestellt werden kann. Andernfalls geht die Präzision verloren. Sie können dies tun, indem Sie überprüfen, ob der float64-Wert innerhalb des darstellbaren Bereichs von uint64 liegt.
Unten finden Sie ein Beispiel für eine Funktion, die die Darstellbarkeit vor der Umwandlung überprüft:
func Float64ToUint64(n float64) (uint64, error) { if (n < 0) || (n > math.MaxUint64) { return 0, errors.New("value out of range") } return uint64(n), nil }
Das obige ist der detaillierte Inhalt vonWie kann ich float64 in Go sicher in uint64 konvertieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!