golang浮点数精度问题

今天遇到一个浮点数截取后计算的问题。截取后的浮点数,再作运算,会导致精度不准确。这种不是必现,而是根据你作运算的具体浮点数决定。 必须想办法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
}

猜你喜欢

转载自my.oschina.net/u/3707537/blog/1810165