英文:
how to force to save all decimal points of bigFloat in file, instead of rounding
问题
假设我有一个非常精确的输入数字(字符串格式),经过math/big操作后,我想再次转换为字符串格式。
package main
import (
"fmt"
"math/big"
"os"
)
func check(e error) {
if e != nil {
panic(e)
}
}
func main() {
// 编辑
s := "3.1415926123456789123456789123456789123456789"
var n, _ = new(big.Float).SetString(s)
// var n = big.NewFloat(3.1415926123456789123456789123456789123456789)
fmt.Println(n) // 3.1415926123456788
N := n.String()
fmt.Println(N) // 3.141592612
d1 := []byte(N)
err := os.WriteFile("./dat1.txt", d1, 0644) // 3.141592612
check(err)
}
如何将类似于3.1415926123456789123456789123456789123456789的big.Float保存到文件中?我想保留所有的小数位数,或者至少尽可能多地保留。
英文:
Let's assume I have a very accurate input number(string format), and after math/big manipulation, I want to convert to string format again.
package main
import (
"fmt"
"math/big"
"os"
)
func check(e error) {
if e != nil {
panic(e)
}
}
func main() {
// edit
s := "3.1415926123456789123456789123456789123456789"
var n, _ = new(big.Float).SetString(s)
// var n = big.NewFloat(3.1415926123456789123456789123456789123456789)
fmt.Println(n) // 3.1415926123456788
N := n.String()
fmt.Println(N) // 3.141592612
d1 := []byte(N)
err := os.WriteFile("./dat1.txt", d1, 0644) // 3.141592612
check(err)
}
How to save a big Float like 3.1415926123456789123456789123456789123456789 into a file? I want to keep all the decimal points, or at least as much as possible
答案1
得分: 3
你可以解析和存储你的输入,但是你必须增加精度(默认精度不够)。可以使用Float.SetPrec()
来增加精度(需要指定位数)。
在生成文本表示时,使用Float.Text()
,同样要使用足够大的精度(需要指定小数位数)。如果你不知道所需的小数精度,根据文档,你可以使用负值,以获得Float
尾数所需的最小十进制位数。
例如:
s := "3.1415926123456789123456789123456789123456789"
fmt.Println(s)
n := big.NewFloat(0)
n.SetPrec(200)
n.SetString(s)
N := n.Text('f', 50)
fmt.Println(N)
N = n.Text('f', -1)
fmt.Println(N)
这将输出(在Go Playground上尝试):
3.1415926123456789123456789123456789123456789
3.14159261234567891234567891234567891234567890000000
3.1415926123456789123456789123456789123456789
英文:
You can parse and store your input "precisely", but you must increase the precision (the default precision doesn't cover that). Use Float.SetPrec()
for that (requires a bit-count).
When generating text representation, use Float.Text()
, again, with sufficiently large precision (requires a decimal digit-count). If you don't know the required digit-precision, as per the doc, you may use a negative value to have the smallest number of decimal digits that is needed for the Float
's mantissa bits.
For example:
s := "3.1415926123456789123456789123456789123456789"
fmt.Println(s)
n := big.NewFloat(0)
n.SetPrec(200)
n.SetString(s)
N := n.Text('f', 50)
fmt.Println(N)
N = n.Text('f', -1)
fmt.Println(N)
This will output (try it on the Go Playground):
3.1415926123456789123456789123456789123456789
3.14159261234567891234567891234567891234567890000000
3.1415926123456789123456789123456789123456789
答案2
得分: 0
我刚刚查看了String方法及其文档(https://pkg.go.dev/math/big#Float.String)。
String方法将x格式化为x.Text('g', 10)的形式...
那么我们来看一下该方法的文档。
func (x *Float) Text(format byte, prec int) string
Text方法根据给定的格式和精度将浮点数x转换为字符串。
精度prec控制数字的位数... 负精度选择了最小的十进制位数,足以唯一标识值x。
你只需要阅读文档即可。
英文:
I've just looked what String method does and its documentation (https://pkg.go.dev/math/big#Float.String).
> String formats x like x.Text('g', 10)...
So let's go to that method doc.
> func (x *Float) Text(format byte, prec int) string
> Text converts the floating-point number x to a string according to the given format and precision prec.
> The precision prec controls the number of digits ... A negative precision selects the smallest number of decimal digits necessary to identify the value x uniquely
All you need is just reading the doc.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论