go int 类型为什么不能和 float 直接比较?

作者站长头像
站长
· 阅读数 26

个人:我目前主要是做前端开发,接触的第一门语言是 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个回答
avatar
test
2024-06-26

如果你觉得11.2小,那3355443133554432.99呢?12345679991234567888.88呢?

后两个问题在C语言中用32位浮点数计算,结果是相等。原因是整数与浮点数直接比较,或是通过字面量给浮点类型赋值,C语言会进行一个隐式转换,而最终转换的结果有时候会不符合直觉,比如像上面两个例子那样。12345679991234567888.88最后都是1234567936.000000

这个问题通常在整数大于1<<25时出现,因为32位浮点数尾数只有23位置,能表示24的整数,超过这个数就会面临精度丢失的问题,比如33554433(1<<25+1),最后会转换成33554432.00

Go作为新时代的C语言,希望语言尽可能简单,不要有隐式转换,不要有函数重载。希望你自己显式转换,避免隐藏的问题

回复
likes
适合作为回答的
  • 经过验证的有效解决办法
  • 自己的经验指引,对解决问题有帮助
  • 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
  • 询问内容细节或回复楼层
  • 与题目无关的内容
  • “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容