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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 11:06:02