求助 float64 赋值 999999999994.999756 精度丢失?

zhengsh · 2020-10-22 13:57:30 · 2570 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2020-10-22 13:57:30 的主题,其中的信息可能已经有所发展或是发生改变。

代码如下

    var fff float64
    fff = 999999999994.999756

QQ图片20201022135539.png


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

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

2570 次点击  
加入收藏 微博
7 回复  |  直到 2020-11-04 14:37:39
jian1098
jian1098 · #1 · 5年之前

打印格式的问题,你用 fmt.Printf("%.6f", fff) 打印就能得到正确结果

zhengsh
zhengsh · #2 · 5年之前

1楼 @jian1098 请问这是为什么呢,是由于 idea 的显示导致的问题, 还是编码的问题

我希望解决的问题是进行一个小数计算

然后最终结果返回 一个float64 的双精度浮点数

流程如下:

var fff float64 = 999999999994.999756
var ggg float64 = 2.00010001
fmt.Printf("%.6f \n", fff)

a := decimal.NewFromFloat(fff)
p := decimal.NewFromFloat(ggg)

result, _ := a.Sub(p).Float64()

fmt.Printf("result = %f \n", result)

2222.png

jian1098
jian1098 · #3 · 5年之前
zhengshzhengsh #2 回复

1楼 @jian1098 请问这是为什么呢,是由于 idea 的显示导致的问题, 还是编码的问题 我希望解决的问题是进行一个小数计算 然后最终结果返回 一个float64 的双精度浮点数 流程如下: ```golang var fff float64 = 999999999994.999756 var ggg float64 = 2.00010001 fmt.Printf("%.6f \n", fff) a := decimal.NewFromFloat(fff) p := decimal.NewFromFloat(ggg) result, _ := a.Sub(p).Float64() fmt.Printf("result = %f \n", result) ``` ![2222.png](https://static.studygolang.com/201022/ffb750edf91cd47826280278f3cdec3d.png)

fmt.Printf输出格式问题呀,%v默认精度4,%f默认精度6,自定义精度就是%.精度f

polaris
polaris · #4 · 5年之前

注意精度问题,我写过一篇文章,详解浮点数。https://mp.weixin.qq.com/s/BmXbChq3RVRmdGNgfxLyvw

zhengsh
zhengsh · #5 · 4年之前
jian1098jian1098 #3 回复

#2楼 @zhengsh fmt.Printf输出格式问题呀,%v默认精度4,%f默认精度6,自定义精度就是%.精度f

好的,我看了 polaris 的文章后我大概明白了为什么

zhengsh
zhengsh · #6 · 4年之前
polarispolaris #4 回复

注意精度问题,我写过一篇文章,详解浮点数。https://mp.weixin.qq.com/s/BmXbChq3RVRmdGNgfxLyvw

谢谢大佬的分享

wupeiqi
wupeiqi · #7 · 4年之前

浮点数本来就不精确的,例如用浮点数计算 0.1 + 0.2 不等于0.3 。

建议看看浮点数底层存储的原理:https://www.bilibili.com/video/BV1354y1B7o1

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传