You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何保留math/big.Float全部小数位写入文件 避免四舍五入

问题根源

  • 默认初始化的big.Float仅使用64位精度,和原生float64精度一致,无法承载超长小数位的高精度数值
  • big.Float.String()方法默认仅输出10位有效数字,就算内部存储了足够精度也会主动截断小数位

解决步骤

  1. 手动设置足够的精度:创建big.Float后调用SetPrec()方法设置精度位,每10位十进制数大概需要34位二进制精度,你可以根据自己需要的小数长度预留足够的精度,比如要存40位十进制数的话设为140位即可满足需求。
  2. 使用fmt格式化或Text()方法输出完整精度:不要直接用String()方法,用fmt.Sprintf配合格式化动词,或者调用Text()方法指定输出格式和精度。

修改后的可运行示例代码如下:

package main

import (
    "fmt"
    "math/big"
    "os"
)

func check(e error) {
    if e != nil {
        panic(e)
    }
}

func main() {   
    s := "3.1415926123456789123456789123456789123456789"
    // 初始化后先设置足够的精度,这里设为200位二进制精度,可承载约60位十进制有效数字
    n := new(big.Float).SetPrec(200)
    n, ok := n.SetString(s)
    if !ok {
        panic("invalid float string")
    }

    // 方法1:用fmt格式化输出,%.50f表示保留50位小数
    N := fmt.Sprintf("%.50f", n)
    fmt.Println(N) // 输出完整的高精度数值,不会截断

    // 方法2:用Text方法,第一个参数是格式('f'表示定点小数),第二个参数是保留的小数位数
    // N := n.Text('f', 50)

    // 如果不需要固定小数位,要自动去掉末尾无意义的0,可以用%g动词:
    // N := fmt.Sprintf("%.50g", n)

    d1 := []byte(N)
    err := os.WriteFile("./dat1.txt", d1, 0644)
    check(err)
}

内容的提问来源于stack exchange,提问作者anonymous

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 05:24:03