golang 浮点数的比较 f == f + 1

var f float32 = 16777216 // 1 << 24
fmt.Println(f == f+1)    // "true"!

var f2 float32 = 1 << 23
fmt.Println(f2 == f2+1)  // "false"!

我看了float32最大表示的数为3.4028234663852886e+38,比1<<24是要大的,请问为啥会出现上面的结果true呢?

最佳答案

该说明Copy以下地址

  1. 虽然精度是 3.4028234663852886e+38 ,但是 在 1 << 24 后的 比如 1<< 25也符合楼主的 为 true
  2. float 不能直接 进行 == 比较 会存在精度丢失问题,float 是通过二进制科学计数法存储在计算机中的
  3. 浮点数 16777216 的二进制为 0-10010111-00000000000000000000000
  4. 浮点数 16777217 的二进制为0-10010111-00000000000000000000000 所以两者相等
  5. 楼主遇到该问题可以搜索 浮点数为什么不能进行等号比较 有很多优秀文章
2年前 评论
讨论数量: 1

该说明Copy以下地址

  1. 虽然精度是 3.4028234663852886e+38 ,但是 在 1 << 24 后的 比如 1<< 25也符合楼主的 为 true
  2. float 不能直接 进行 == 比较 会存在精度丢失问题,float 是通过二进制科学计数法存储在计算机中的
  3. 浮点数 16777216 的二进制为 0-10010111-00000000000000000000000
  4. 浮点数 16777217 的二进制为0-10010111-00000000000000000000000 所以两者相等
  5. 楼主遇到该问题可以搜索 浮点数为什么不能进行等号比较 有很多优秀文章
2年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!