Heim >Backend-Entwicklung >Golang >Warum unterscheidet sich „912 * 0.01' von „float64(912) * 0.01' in Go?
Unterschied in der Float64-Präzision: Auspacken variierender Werte
Betrachten Sie das folgende Beispiel in Go:
fmt.Println(912 * 0.01) fmt.Println(float64(912) * 0.01)
Das erste Die Anweisung gibt 9,12 aus, während die zweite Anweisung ergibt 9.120000000000001. Dieser scheinbare Unterschied in der Präzision kann rätselhaft sein.
Gemäß der Go-Sprachspezifikation werden konstante Ausdrücke exakt ausgewertet. In diesem Fall ist 912 * 0,01 ein konstanter Ausdruck. Die genaue Auswertung ergibt 9,12, der anschließend float64(912 * 0,01) zugewiesen und an fmt.Println() übergeben wird.
Alternativ ist float64(912) * 0,01 auch ein konstanter Ausdruck. Allerdings wird der linke Operand, ursprünglich eine Ganzzahl, vor der Multiplikation explizit in float64 umgewandelt. Dies bedeutet, dass 0,01 implizit auch in float64 konvertiert wird, was zu einer Multiplikation zwischen zwei float64-Werten führt.
Entscheidend ist, dass 0,01 nicht genau als float64 darstellbar ist. Es wird auf den nächsten darstellbaren Wert gerundet, was zu einer leichten Ungenauigkeit führt. Als Ergebnis ergibt float64(912) * 0,01 den Wert 9,120000000000001, der dann gedruckt wird.
Zusammenfassend ergibt sich der Unterschied in der Ausgabe aus der Auswertung konstanter Ausdrücke: ob die Umwandlung vor oder während der Auswertung erfolgt, und ob aufgrund der Einschränkung der float64-Präzision Ungenauigkeiten auftreten.
Das obige ist der detaillierte Inhalt vonWarum unterscheidet sich „912 * 0.01' von „float64(912) * 0.01' in Go?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!