なぜGoで次のように等しくないのですか?これはバグですか、それとも設計上のものですか?それが仕様であれば、なぜこれが起こり、このタイプの動作はどこに文書化されていますか?なぜ、浮動小数点の乗算とリテラルの違いと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)
}
生成し:
x == 10.1: true
x*3.0 == 10.1*3.0: false
x*3.0: 30.299999999999997
10.1*3.0: 30.3
注同じ浮動小数点演算は、単に異なる構文を使用して、行われていること。それではなぜ結果が違うのですか?私は、の例のように10.1*3.0
が30.29999...
に等しくなると思います。
[浮動小数点数は壊れていますか?](https://stackoverflow.com/questions/588004/is-floating-point-math-broken) –
Ken、ありがとうございます。これは同じ問題ではないと私は考えています。なぜなら、その問題は、よく知られている浮動小数点数学の精度に関する問題が多言語であるからです。ここでは、同じ浮動小数点演算が実行されていますが、構文が異なるだけです。それでも結果は異なります。明確にするために、 'x * 3.0'の例のように' 10.1 * 3.0'が '' 30.299999 ... 'になると期待します。 –
「同じ浮動小数点演算が実行されています」というステートメントは、間違ったところです。 – hobbs