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

问题描述 投票:-1回答:1

如果你将一个字符串解析为像f.SetString("0.001")这样的big.Float,那么乘以它,我看到精度的损失。如果我使用f.SetFloat64(0.001),我不会失去精确度。即使做一个strconv.ParseFloat("0.001", 64),然后调用f.SetFloat()工作。

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

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

扩展到这个问题:https://stackoverflow.com/a/47546136/105562

go
1个回答
0
投票

输出的差异是由于float64IEEE-754 format)中基数10浮点数的不精确表示以及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.001,而big.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
© www.soinside.com 2019 - 2024. All rights reserved.