go - 如何强制将 bigFloat 的所有小数点保存在文件中,而不是四舍五入
问题描述
假设我有一个非常准确的输入数字(字符串格式),并且在数学/大操作之后,我想再次转换为字符串格式。
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)
}
如何将像 3.1415926123456789123456789123456789123456789 这样的大浮点数保存到文件中?我想保留所有小数点,或者至少尽可能多
解决方案
您可以“精确地”解析和存储您的输入,但您必须提高精度(默认精度不包括在内)。用于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
推荐阅读
- php - 为什么我在 Laravel 中使用 PostController 时得到未定义的变量?
- javascript - 为什么即使我在其中推送值,空数组仍然是空的?
- angular - 带有垂直垫选项卡组的角度 CDK 拖放
- python - scrapy spider 不需要aws secret 来访问s3?
- xml - 根据复杂条件从 XML 中删除元素
- react-native - the experimental syntax 'decorators-legacy is not supported and shows an error when i try to use mobx tools on my react app
- javascript - appendChild 的问题
- 并让图像匹配
- 元素
- ruby-on-rails - 无法检索活动的 ActionCable 频道
- java - 可以将 java 切线转换为双精度
- javascript - 清楚地理解使用 Let 关键字