美文网首页
golang比较浮点数是否相等

golang比较浮点数是否相等

作者: 郭青耀 | 来源:发表于2020-04-14 17:48 被阅读0次

由于小数二进制和十进制转换的时候,会有精度丢失的问题,所以我们在比较浮点数是否相等,指的是在一定精度范围内的两个浮点数是否相等。
参看了网上其他人的实现
实现1实现2
基本上都一样,于是我就改了几个值验证了一下,
结果发下

package main

import (
    "fmt"
    "math"
)
const MIN = 0.000001
// MIN 为用户自定义的比较精度
func IsEqual(f1, f2 float64) bool {
    return math.Dim(f1, f2) < MIN
}
func main() {
    a := 0.9
    b := 1.0
        
    if IsEqual(a, b) {
        fmt.Println("a==b")
    }else{
        fmt.Println("a!=b")
    }
}

这两个数相差为0.1 ,大于可以认为相等的精度,应该输出是a!=b,,但是很神奇,这个程序输出的结果是a==b,而且这个程序被多个网站转载。

那么这个程序一定是有什么地方没有考虑到。
这是一个逻辑很简单的程序,不知道当初写这个程序的人为什么要使用math.Dim,看起来高大上,百度了一下,前两条给的说明是:https://my.oschina.net/u/3625745/blog/3062717,https://www.lmlphp.com/user/2043/article/item/342102/含义“复数的维度”。老实说没有看懂。按照浮点数的原理,这里equal功能只是,比较一下大小,两者相差(不关心正负,需要取绝对值),小于可以接受的精度,即可认为相等

package main

import "fmt"

const MIN = 0.000001
// MIN 为用户自定义的比较精度
func IsEqual(f1, f2 float64) bool {
    if f1>f2 {
        return f1-f2< MIN
    }else{
        return f2-f1<MIN
    }
}

func main() {
    a := 0.9
    b := 1.0
    if IsEqual(a, b) {
        fmt.Println("a == b")
    }else{
        fmt.Println("a!=b")
    }
}

这样输出的结果就对了,顺便也测试了精度小于0.000001的两个数直接判断相等了。

那么原来的程序错在什么地方呢?
查看看一下math.Dim的文档," Dim() function provided by the math package return the maximum of a-b or 0. "
也就是这个函数比较第一个参数和第二个参数的差值,然后和0比较大小。我们这里需要精度是两个参数的差的绝对值,不关注正负。

package main

import (
    "fmt"
    "math"
)
const MIN = 0.000001
// MIN 为用户自定义的比较精度
func IsEqual(f1, f2 float64) bool {
    if f1>f2{
        return math.Dim(f1, f2) < MIN
    }else{
        return math.Dim(f2, f1) < MIN
    }
}
func main() {
    a := 0.9
    b := 1.0
        
    if IsEqual(a, b) {
        fmt.Println("a==b")
    }else{
        fmt.Println("a!=b")
    }
}

这样运算结果就对了。但是这样多引入了math包,实际程序也没有变得简单。所以写程序还是应该追求简单实用,不要为了高大上而复杂。

相关文章

  • golang比较浮点数是否相等

    由于小数二进制和十进制转换的时候,会有精度丢失的问题,所以我们在比较浮点数是否相等,指的是在一定精度范围内的两个浮...

  • Swift 浮点数比较是否相等

    infix operator ~= : ComparisonPrecedencefunc ~= (lhs:T...

  • 浮点数如何比较是否相等

    由于浮点数伴随着无法精确表示而进行近似或舍入,处理器是32位还是64位都会导致浮点数值不一样,所以浮点数不能够使用...

  • 浮点数的比较&初识String

    小心使用浮点数进行比较 浮点数没有绝对的相等,只有近似的相等。Java中只有整数才有绝对的相等。 例如: 结果:t...

  • Java判断浮点数相等

    判断浮点数是否相等 不可以 直接用 ==

  • Cocos2dx之C++基础(五)

    const char ? 之间的关系 如何判断系统是32位还是64位 如何比较两个浮点数是否相等

  • 两个浮点数做比较

    两个浮点数做相等比较。以前一直没有怎么在意这个坑。但是现在遇到了:如果两个浮点数相等比较,不能用 a == b 这...

  • Golang比较两个slice是否相等

    Compare two string slices in GoLang 开发中经常会遇到需要比较两个slice包含...

  • c++ 浮点数相等判断背后的陷阱和原理

    我们应该注意的是:在我们的代码中,涉及到浮点数比较的问题,千万不要尝试去比较两数是否相等。在讲解问题、解决方法以及...

  • Item8 对象相等

    Item8 对象相等 ==通常是比较指针的值是否相等,isEqual比较指针指向的对象是否相等 isEqualTo...

网友评论

      本文标题:golang比较浮点数是否相等

      本文链接:https://www.haomeiwen.com/subject/fpjtvhtx.html