为了账号安全,请及时绑定邮箱和手机立即绑定

高朗计算全精度浮点数

高朗计算全精度浮点数

Go
PIPIONE 2022-09-26 19:55:51
使用小数点200作为精度,我需要计算一个从atto到十进制数的数字类似的截图。
查看完整描述

3 回答

?
九州编程

TA贡献1785条经验 获得超4个赞

要以纳米和阿托的精度获得值,您可以使用 和 在 fmt 中。Printf() 分别,我创建了一个小程序来获取您的价值如下:%.9f%.18f0.000000000000099707


package main


import (

    "fmt"

    "math"

)


func main() {


    powr := math.Pow(10, -18)

    numb := 99707 * powr

    fmt.Println("number", numb)

    fmt.Printf("\nthe value in atto %.18f\n", numb)

}

输出:


number 9.970700000000001e-14


the value in atto 0.000000000000099707


查看完整回答
反对 回复 2022-09-26
?
墨色风雨

TA贡献1853条经验 获得超6个赞

您也可以将包用于此目的。此库可以表示最多 2^31 (2147483648) 位数字。下面是一个简单的代码来执行计算:github.com/shopspring/decimal


d := decimal.NewFromInt(99707)

d10 := decimal.NewFromInt(10)

dpow := decimal.NewFromInt(-18)

d10pow := d10.Pow(dpow)

dmul := d.Mul(d10pow)

fmt.Println(dmul)

这可以简化为:


d := decimal.NewFromInt(99707).Mul(decimal.NewFromInt(10).Pow(decimal.NewFromInt(-18)))

fmt.Println(d)

输出:0.000000000000099707


查看游乐场


查看完整回答
反对 回复 2022-09-26
?
大话西游666

TA贡献1817条经验 获得超14个赞

我对如何做到这一点很感兴趣,所以我从蟑螂那里找到了处理任意精确计算的apd包。您可以像这样使用它:


import (

    "fmt"

    "github.com/cockroachdb/apd"

)


func main() {

    // 99707 * 10^(-18)

    n1 := apd.New(99707, 0)

    n2 := apd.New(10, 0)

    n3 := apd.New(-18, 0)

    c := apd.BaseContext.WithPrecision(200)

    res := apd.New(0,0)


    ctx, err := c.Pow(res, n2, n3)

    if err != nil {

        panic(err)

    }

    ctx, err = c.Mul(res, res, n1)

    if err != nil {

        panic(err)

    }

    

    fmt.Println(ctx.Inexact(), res.Text('f'))

}

它将输出:


false 0.000000000000099707

您必须小心可能发生的精度损失,并查看不精确的字段。


查看完整回答
反对 回复 2022-09-26
  • 3 回答
  • 0 关注
  • 92 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信