个人:我目前主要是做前端开发,接触的第一门语言是 js,由于业务的需求,现在想补充一下 go 的后端知识。(刚学习 go 两天)
问题:了解到在 go 中,不能直接将 int 类型和 float 类型做比较,虽然明白静态语言相较于 js 来说对类型限制比较严格,但是类比到现实生活中还是无法理解这样设计的原因是什么?
package main
import "fmt"
func main(){
age1:=1
age2:=3.3
fmt.Println(age1<age2)
//报错invalid operation: cannot compare test > age (mismatched types float64 and int)
}
现实生活中我们不是早已习惯 1.2>1 或者 0.5<100 这样的小数和整数比较吗?为什么 go 要这样设计呢?
或者说如果允许 float 和 int 直接比较,会造成什么很难处理的场面吗?
如果你觉得
1
比1.2
小,那33554431
和33554432.99
呢?1234567999
和1234567888.88
呢?后两个问题在C语言中用32位浮点数计算,结果是相等。原因是整数与浮点数直接比较,或是通过字面量给浮点类型赋值,C语言会进行一个隐式转换,而最终转换的结果有时候会不符合直觉,比如像上面两个例子那样。
1234567999
和1234567888.88
最后都是1234567936.000000
。这个问题通常在整数大于
1<<25
时出现,因为32位浮点数尾数只有23位置,能表示24的整数,超过这个数就会面临精度丢失的问题,比如33554433(1<<25+1)
,最后会转换成33554432.00
。Go作为新时代的C语言,希望语言尽可能简单,不要有隐式转换,不要有函数重载。希望你自己显式转换,避免隐藏的问题