下面的符合预期:
a := (float64(0) - 32) * 5 / 9
b := (0.0 - 32) * 5 / 9
fmt.Println(a == b, a, b)
// Output: true -17.77777777777778 -17.77777777777778
但它们分别加上 273.15,结果竟然不同了:
c := (float64(0) - 32)*5/9 + 273.15
d := (0.0 - 32)*5/9 + 273.15
fmt.Println(c == d, c, d)
// Output: false 255.3722222222222 255.37222222222223
这是为什么?
---
https://play.golang.org/p/0v1PjVwNOnI
`0.0`和`float64(0)`类型不一样,前者是无类型浮点数(精度更高),后者是float64,不同类型在精度上的差别影响了后续的计算过程得到的中间值的精度
> Constant expressions are always evaluated exactly; intermediate values and the constants themselves may require precision significantly larger than supported by any predeclared type in the language.
https://golang.org/ref/spec#Constant_expressions
#6
更多评论
拿代码测试了一下,
其实刚才隐约感觉这个和存储的字节数有关系.
```go
a := (float64(0) +1.1) * 5 / 9 + 200.14
b := (0.0 +1.1) * 5 / 9 + 200.14
fmt.Println(a == b, a, b)
```
不超过255, 就会相等,不知道深层次的原理是什么也许需要调汇编看一下才明白.
不研究了,知道坑避开就行, 浮点数不可以用==进行相等判断是一个rule
#2