gpt4 book ai didi

go - 精度乘以 big.Float 的奇怪损失

转载 作者:数据小太阳 更新时间:2023-10-29 03:36:41 33 4
gpt4 key购买 nike

如果您将字符串解析为 big.Float,如 f.SetString("0.001"),然后将其相乘,我会发现精度有所下降。如果我使用 f.SetFloat64(0.001),我不会失去精度。即使执行 strconv.ParseFloat("0.001", 64),然后调用 f.SetFloat() 也能正常工作。

我在这里看到的完整示例:

https://play.golang.org/p/_AyTHJJBUeL

从这个问题展开:https://stackoverflow.com/a/47546136/105562

最佳答案

输出的差异是由于 float64 ( IEEE-754 format ) 中以 10 为底的 float 表示不精确以及 big.Float 的默认精度和舍入造成的.

查看这个简单的代码来验证:

fmt.Printf("%.30f\n", 0.001)
f, ok := new(big.Float).SetString("0.001")
fmt.Println(f.Prec(), ok)

上面的输出(在 Go Playground 上尝试):

0.001000000000000000020816681712
64 true

所以我们看到的是float640.001不完全是0.001big.Float的默认精度 是 64。

如果您通过 string 值增加您设置的数字的精度,您将看到相同的输出:

s := "0.001"
f := new(big.Float)
f.SetPrec(100)
f.SetString(s)
fmt.Println(s)
fmt.Println(BigFloatToBigInt(f))

现在输出也将相同(在 Go Playground 上尝试):

0.001
1000000000000000

关于go - 精度乘以 big.Float 的奇怪损失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52160754/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com