Die Diskrepanz
In Go ist die Der folgende Codeausschnitt zeigt einen interessanten Unterschied in der Gleitkommazahl Berechnungen:
package main import ( "fmt" ) func main() { x := 10.1 fmt.Println("x == 10.1: ", x == 10.1) fmt.Println("x*3.0 == 10.1*3.0:", x*3.0 == 10.1*3.0) }
Bei der Ausführung erzeugt dieser Code unerwartete Ergebnisse:
x == 10.1: true x*3.0 == 10.1*3.0: false
Während die gleichen Gleitkommaoperationen ausgeführt werden, wird entweder eine deklarierte Variable (x) oder ein Literal verwendet (10.1) schlägt die Gleichheitsprüfung fehl.
Ursprung der Unterschied
Um dieses Verhalten zu verstehen, muss man sich mit Gos Umgang mit Gleitkommazahlen befassen. Konstanten und Zahlenliterale sind zunächst untypisiert und besitzen die Eigenschaft „无限精度“. Wenn sie jedoch einer Variablen zugewiesen oder typkonvertiert werden, erben sie die Einschränkungen des Zieltyps.
Wenn x := 10.1 zugewiesen wird, verliert das Literal 10.1 aufgrund der Konvertierung in eine Gleitkommazahl etwas an Präzision. Umgekehrt behält 10,1*3,0 seine volle Genauigkeit bei der Berechnung. Dies erklärt den beobachteten Unterschied in den Werten und die falsche Gleichheitsprüfung.
Dokumentation und Begründung
Dieses Verhalten wird im Abschnitt „Floats“ von Gos Blog-Beitrag beschrieben Konstanten:
"Numerische Konstanten leben in einem numerischen Raum beliebiger Genauigkeit; sie sind nur reguläre Zahlen. Aber wann Sie werden einer Variablen zugewiesen, deren Wert in das Ziel passen muss Feinheiten der Gleitkommadarstellung in Go. Dieses Wissen ermöglicht es Entwicklern, präzisionsbezogene Probleme in ihrem Code effektiv zu antizipieren und zu bewältigen.
Das obige ist der detaillierte Inhalt vonWarum schlägt die Gleitkommagleichheit beim Vergleich von Variablen und Literalen fehl?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!