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())
}
运行结果如下:

