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

个人:我目前主要是做前端开发,接触的第一门语言是 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 直接比较,会造成什么很难处理的场面吗?

阅读 1k
1 个回答

如果你觉得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语言,希望语言尽可能简单,不要有隐式转换,不要有函数重载。希望你自己显式转换,避免隐藏的问题

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题