超长float64位计算,不知是BUG还是使用错误,请高人指教!

ohko · 2015-08-27 14:27:46 · 2429 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2015-08-27 14:27:46 的主题,其中的信息可能已经有所发展或是发生改变。

计算正常

var a float64 = 12959653081233152683760791820268915873095215894259158297207384037775798390732947435759407568730776231939495920976951779674164698735094020653357745276190720
    var b float64 = 38702708391292475707970394122420465445262695173878312073868790125970680813462212621273021068406482338979482750490461442604850467520473202688
    // 正确结果:12959653081233191386469183112744623843489338314724603559902557916087872259523073406440221030943397504960564327459290759156915189196536625503825265749393408
    fmt.Println(strconv.FormatFloat(a+b, 'f', 0, 64))

计算出问题

var a float64 = 12959653081233191386469183112744623843489338314724603559902557916087872259523073406440221030943397504960564327459290759156915189196536625503825265749393408
    var b float64 = 1302494993937727547864388263735304125561725318351673964024430436931705604299209078600534362879064309484886438718428990856894006118477463552
    // 正确结果:12959653081233192688964177050472171707877602050028729121627876267761836283953510338145825330152476105494927206523600244043353907625527482397831384226856960
    // 输出结果:12959653081233192875034890470147535688504496869357889916160064603715259716015001328389483087182344476999836189247073027598559438829669033382689401152208896
    fmt.Println(strconv.FormatFloat(a+b, 'f', 0, 64))

那么问题来了

不看多的,就看个位,计算就有问题了。

是不是不应该这样计算?

在PHP中有bcadd,go里面有没有类似的函数呢?

望高人指教!


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

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

2429 次点击  ∙  1 赞  
加入收藏 微博
2 回复  |  直到 2015-08-28 02:48:30
qkb_75_go
qkb_75_go · #1 · 10年之前

楼主 对浮点运算的基本概念是不对的。 浮点数因为有 存储长度限制,末尾一定是是有误差的, 浮点数的计算结果要从 最高位 往 最低位 看!不能从 最低位 往最低位看!

楼主需要的是 大数 精确计算, 试下 golang 的 bignum 包吧。

peterrk
peterrk · #2 · 10年之前

楼上正解,float64的名字就已经表明它只有64位...

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