Golang浮点数比较和运算会出现误差,我们来看看下面的例子:
package main
import "fmt"
func main(){
var a float64=1.5
var b float64=1.3
var result float64=a-b
if result==0.2 {
fmt.Println("相等")
}else{
fmt.Println("不相等")
}
fmt.Printf("%.20f\n ",result)
//浮点数运算后,转换成int64位
var c float64 = 78.6
fmt.Println(int64(c *100))
}
执行结果是:
很明显,结果不是我们想要的, 运算的误差导致程序不按照我们的逻辑走,所以可以的话,尽量不要比较浮点数,
浮点数的运算和比较,可以使用第三方扩展包来实现:
go get github.com/shopspring/decimal
安装后,我们来看如何解决上面的问题:
package main
import (
"fmt"
"github.com/shopspring/decimal"
"reflect"
)
func main() {
num1:=decimal.NewFromFloat(1.5)
num2:=decimal.NewFromFloat(1.3)
num3:=decimal.NewFromFloat(0.2)
result:=num1.Sub(num2) //num1 - num2
fmt.Println(result,reflect.TypeOf(result))
//比较是否相等
if result.Cmp(num3)==0 {
fmt.Println("相等!")
}else{
fmt.Println("不相等!")
}
num4:=decimal.NewFromFloat(78.6)
num5:=decimal.NewFromFloat(100)
result=num4.Mul(num5) //num4*num5
fmt.Println("结果是:",result.String())
}
运行结果如下: