Golang实现200位精度全精度浮点数计算 完成atto单位转十进制
Go高精度atto单位转十进制实现方案
- 精度配置:要实现小数点后200位的计算精度,需为
math/big包的big.Float设置至少665位二进制精度(十进制1位对应约3.32位二进制精度,实际设置700位预留冗余避免精度损耗) - 转换逻辑:atto单位对应10^-18换算倍率,转换公式为
常规十进制值 = atto数值 / 10^18,输入优先使用字符串类型避免初始值精度丢失
完整代码示例
package main import ( "fmt" "math/big" "strings" ) // AttoToDecimal 将atto单位的整数字符串转换为保留200位小数的十进制字符串 func AttoToDecimal(attoStr string) (string, error) { // 解析输入的atto整数字符串 attoInt, ok := new(big.Int).SetString(attoStr, 10) if !ok { return "", fmt.Errorf("invalid atto value: %s", attoStr) } // 配置200位十进制精度对应的二进制精度 const precision = 700 attoFloat := new(big.Float).SetPrec(precision).SetInt(attoInt) // 生成1e18的高精度浮点数除数 divisor := new(big.Float).SetPrec(precision).SetInt64(1e18) // 执行除法运算 result := new(big.Float).SetPrec(precision).Quo(attoFloat, divisor) // 格式化输出,保留200位小数 formatStr := fmt.Sprintf("%%.%df", 200) resultStr := fmt.Sprintf(formatStr, result) // 去除末尾多余的0和冗余的小数点 resultStr = strings.TrimRight(resultStr, "0") resultStr = strings.TrimSuffix(resultStr, ".") return resultStr, nil } func main() { // 测试用例 testVal := "123456789012345678901234567890" res, err := AttoToDecimal(testVal) if err != nil { panic(err) } fmt.Println("转换结果:", res) }
效果说明
运行代码后输入atto单位数值即可输出无精度损失的十进制值,支持最长200位小数完整展示,不会出现浮点数精度溢出、截断问题。
内容的提问来源于stack exchange,提问作者Javad
相关产品推荐
相关产品推荐

