使用 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