golang 处理小数点减法处理方案

90 阅读1分钟

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指数−偏移量) 导致最后一位会被四舍五入.