Warum sind die folgenden in Go ungleich? Ist das ein Fehler, oder ist es Absicht? Wenn es von Entwurf ist, warum tritt das auf und ist diese Art von Verhalten überall dokumentiert?Warum gibt es einen Unterschied zwischen Fließkomma-Multiplikation mit Literalen vs. Variablen in Go?
https://play.golang.org/p/itEV9zwV2a
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)
fmt.Println("x*3.0: ", x*3.0)
fmt.Println("10.1*3.0: ", 10.1*3.0)
}
Erzeugt:
x == 10.1: true
x*3.0 == 10.1*3.0: false
x*3.0: 30.299999999999997
10.1*3.0: 30.3
anzumerken, dass die gleiche Gleitpunktarithmetik wird, mit unterschiedlicher Syntax nur durchgeführt wird. Warum ist das Ergebnis anders? Ich würde erwarten, 10.1*3.0
gleich wie in der x*3.0
Beispiel.
Mögliche Duplikate von [Ist Fließkomma-Mathematik gebrochen?] (Https://stackoverflow.com/questions/588004/is-floating-point-math-broken) –
Ken, danke. Ich denke nicht, dass dies das gleiche Problem ist, da es sich bei dieser Frage um die bekannten Gleitkomma-mathematischen Genauigkeitsprobleme in vielen Sprachen handelt. Hier wird die gleiche Fließkomma-Mathematik ausgeführt, jedoch nur mit unterschiedlicher Syntax. Doch das Ergebnis ist anders. Zur Klarstellung würde ich erwarten, dass "10.1 * 3.0" gleich "30.299999 ..." ist, wie im Beispiel "x * 3.0". –
Die Aussage, dass "die gleiche Fließkomma-Mathematik ausgeführt wird", ist der Punkt, an dem Sie falsch liegen. – hobbs