golang浮点数精度问题

丶老邪 · · 13726 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

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

 

 


有疑问加站长微信联系(非本文作者)

本文来自:开源中国博客

感谢作者:丶老邪

查看原文:golang浮点数精度问题

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

13726 次点击  
加入收藏 微博
1 回复  |  直到 2019-10-22 15:09:45
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传