如何保留math/big.Float全部小数位写入文件 避免四舍五入
问题根源
- 默认初始化的
big.Float仅使用64位精度,和原生float64精度一致,无法承载超长小数位的高精度数值 big.Float.String()方法默认仅输出10位有效数字,就算内部存储了足够精度也会主动截断小数位
解决步骤
- 手动设置足够的精度:创建
big.Float后调用SetPrec()方法设置精度位,每10位十进制数大概需要34位二进制精度,你可以根据自己需要的小数长度预留足够的精度,比如要存40位十进制数的话设为140位即可满足需求。 - 使用
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
相关产品推荐
相关产品推荐

