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())

}

运行结果如下: