如果你将一个字符串解析为像f.SetString("0.001")
这样的big.Float,那么乘以它,我看到精度的损失。如果我使用f.SetFloat64(0.001)
,我不会失去精确度。即使做一个strconv.ParseFloat("0.001", 64)
,然后调用f.SetFloat()
工作。
我在这里看到的完整例子:
输出的差异是由于float64
(IEEE-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
所以我们看到的是float64
值0.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