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
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
查看游乐场
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
您必须小心可能发生的精度损失,并查看不精确的字段。
- 3 回答
- 0 关注
- 101 浏览
添加回答
举报