今天遇到一个浮点数截取后计算的问题。截取后的浮点数,再作运算,会导致精度不准确。这种不是必现,而是根据你作运算的具体浮点数决定。 必须想办法100%避免这种问题。
直接上代码吧
问题代码
package main
import (
"fmt"
"strconv"
)
func main() {
var ff, e float64
e = 100.00
ff = -0.210615789
ff = FloatRound(ff, 4)
fmt.Println(ff) // 输出 -0.2106
qq := ff * e
fmt.Println(qq) // 输出 -21.060000000000002
}
// 截取小数位数
func FloatRound(f float64, n int) float64 {
format := "%." + strconv.Itoa(n) + "f"
res, _ := strconv.ParseFloat(fmt.Sprintf(format, f), 64)
return res
}
可以看到qq的输出,并不是我们想到那样是-21.06.
所以以后对于浮点数的截取动作一定要放在运算之后。正确代码如下
package main
import (
"fmt"
"strconv"
)
func main() {
var ff, e float64
e = 100.00
ff = -0.210615789
// 先计算
qq := ff * e
fmt.Println(qq) // 输出 -21.0615789
// 再截取
qq = FloatRound(qq, 4)
fmt.Println(qq) // 输出 -21.0616
}
// 截取小数位数
func FloatRound(f float64, n int) float64 {
format := "%." + strconv.Itoa(n) + "f"
res, _ := strconv.ParseFloat(fmt.Sprintf(format, f), 64)
return res
}