Golang中浮点数(float)不能直接比较详解
Go  /  管理员 发布于 3年前   2199
为什么不是直接进行 == 比较而是需要写一个方法来进行比较?
答:
浮点数在计算计中的存储是通过二进制的方式进行存储会存在一个精度丢失的问题。
看看浮点数的精度问题:
浮点数[0]的二进制为[0-00000000-00000000000000000000000]
浮点数[0.000000000000000000000000000000000000000000001]的二进制为[0-00000000-00000000000000000000001]
浮点数[16777216]的二进制为[0-10010111-00000000000000000000000]
浮点数[16777217]的二进制为[0-10010111-00000000000000000000000]
上面第2行是float32能表示的最接近0的小数了,再小的话表示不了。此时精度非常高。
但随着数字离0越来越远,即除去符号位,数字越来越大,精度会慢慢丢失,原因是指数位能表示的小数点偏移量最大127。
那么浮点数越大,小数点就越往右移,此时存储时右边被截断的数字就越多,精度自然就丢失了。
可以看出第3/4两行,16777216与16777217的浮点数存储居然是一样的,此时的最小精度已经大于1了。
比较float是否相等的函数
const MIN = 0.000001
// IsEqual
// 判断 float 是否相等
func IsEqual(x, y float64) bool {
return math.Abs(x-y) < MIN
}
总结
开发过程中,极端情况下,一个大数与另一个小数进行操作,容易出现精度丢失严重导致结果误差大的问题。
所以一般我们建议不要用单精度float32,而是用双精度float64,增加的8字节让指数位和数据位都增大了,精度自然有所提高,使用更安全
122 在
学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..123 在
Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..原梓番博客 在
在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..博主 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..1111 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
Copyright·© 2019 侯体宗版权所有·
粤ICP备20027696号