首页 > 解决方案 > 如何强制将 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 这样的大浮点数保存到文件中?我想保留所有小数点,或者至少尽可能多

标签: go

解决方案


您可以“精确地”解析和存储您的输入,但您必须提高精度(默认精度不包括在内)。用于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

推荐阅读