0.3+0.2=?
var a float64
var b float64
var c float64
a = 0.3
b = 0.2
c = a - b
log.Println(c)
0.09999999999999998
原因
在处理于小数点业务相关的问题中遇到了这个坑.先说解决方案
方法1:
//已知道x位置的小数
const factor = 100000000 // 用于转换的因子,这里是10^x,考虑到最多x位小数
var a, b, c float64
a = 0.31
b = 0.2
var aa, bb int
aa = int(a * factor)
bb = int(b * factor)
c = float64(aa-bb) / factor
方案2 老老实实用高进度的库 但是他本质是也是用math/big来计算
value := decimal.NewFromFloat(0.145)
// 四舍五入到小数点后两位
roundedValue := value.Sub(decimal.NewFromFloat(0.005))
val, _ := roundedValue.Float64()
log.Println(val)
原理
参考csapp,大概就是因为是有二进制来表达的小数点,最后一位 (值=(−1)符号位×1.尾数×2指数−偏移量) 导致最后一位会被四舍五入.