golang比较浮点数是不是相等
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了golang比较浮点数是不是相等相关的知识,希望对你有一定的参考价值。
参考技术A 由于小数二进制和十进制转换的时候,会有精度丢失的问题,所以我们在比较浮点数是否相等,指的是在一定精度范围内的两个浮点数是否相等。参看了网上其他人的实现
实现1 , 实现2
基本上都一样,于是我就改了几个值验证了一下,
结果发下
那么这个程序一定是有什么地方没有考虑到。
这是一个逻辑很简单的程序,不知道当初写这个程序的人为什么要使用math.Dim,看起来高大上,百度了一下,前两条给的说明是: https://my.oschina.net/u/3625745/blog/3062717,https://www.lmlphp.com/user/2043/article/item/342102/ 含义“复数的维度”。老实说没有看懂。按照浮点数的原理,这里equal功能只是,比较一下大小,两者相差(不关心正负,需要取绝对值),小于可以接受的精度,即可认为相等
这样输出的结果就对了,顺便也测试了精度小于0.000001的两个数直接判断相等了。
那么原来的程序错在什么地方呢?
查看看一下math.Dim的文档," Dim() function provided by the math package return the maximum of a-b or 0. "
也就是这个函数比较第一个参数和第二个参数的差值,然后和0比较大小。我们这里需要精度是两个参数的差的绝对值,不关注正负。
这样运算结果就对了。但是这样多引入了math包,实际程序也没有变得简单。所以写程序还是应该追求简单实用,不要为了高大上而复杂。
一个比较float是否相等的工具类
比较 float 是否相等
为什么不是直接进行 == 比较而是需要写一个方法来进行比较?
因为 浮点数在计算计中的存储是通过二进制的方式进行存储会存在一个精度丢失的问题。
- 比如 :
浮点数16777216
的二进制为0-10010111-00000000000000000000000
浮点数16777217
的二进制为0-10010111-00000000000000000000000
所以两者相等. - 具体原因可以参考文章
https://www.cnblogs.com/JoZSM...
2.工具类
const MIN = 0.000001
// IsEqual
// 判断 float 是否相等
func IsEqual(x, y float64) bool {
return math.Abs(x-y) < MIN
}
以上是关于golang比较浮点数是不是相等的主要内容,如果未能解决你的问题,请参考以下文章