使用decimal包解决golang浮点数运算失真

使用decimal包解决golang浮点数运算失真

使用 decimal 包解决 golang 浮点数运算失真

实现

package service

import (
	"github.com/shopspring/decimal"
	"testing"
)

func TestDecimal(t *testing.T) {
	var a float64 = 0.3
	var b float64 = 0.6
	t.Logf("a+b=%v", a+b) // 0.8999999999999999 正常应该是0.9,失真了

	a1 := decimal.NewFromFloat(a)
	b1 := decimal.NewFromFloat(b)
	t.Logf("a1+b1=%v", (a1.Add(b1)).String()) // 0.9
}

注意

decimal 建议只用做计算;不建议用来字符串和浮点数之间转换,比如 Decimal 转 float64 会自定约算小数点,而且大量数据计算下性能差

var val = "0.8999999999999999"  在经过Decimal 转float64 后val=0.9 

参考资料

浮点精度(float、double)运算不精确的原因_marco__的博客-CSDN 博客_java 浮点数运算不精确的原因

go--decimal 使用_狮子 QH 的博客-CSDN 博客_decimal go