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

使用C#将科学计数法转换为长数字及解决精度丢失问题

解决C#中科学计数法转长数字的精度问题

这个问题我之前也碰到过,其实核心原因是Double类型的精度限制——它没办法精确表示所有超出其有效位数的大整数,所以用Double.Parse自然会出现精度丢失(也就是你说的四舍五入)。下面给你两种针对性的解决方案:

1. 处理整数型科学计数法(比如你的8.9148E+19):用BigInteger

BigInteger是.NET专门用来处理任意大整数的类型,完全不会有精度丢失问题。只需要在解析时指定支持科学计数法的格式参数就行:

using System.Numerics; // 记得引用这个命名空间
using System.Globalization;

string scientificStr = "8.9148E+19";
BigInteger result = BigInteger.Parse(
    scientificStr,
    NumberStyles.Float | NumberStyles.AllowExponent,
    CultureInfo.InvariantCulture
);

// 输出完整的长数字字符串
Console.WriteLine(result.ToString()); // 会打印 89148000000000000000

2. 处理带小数的科学计数法(比如3.58E+14):用Decimal

Decimal类型拥有28-29位的有效精度,比Double高很多,能精确表示大部分日常遇到的科学计数法数值(只要不超出它的范围):

using System.Globalization;

string scientificStr = "3.58E+14";
Decimal decimalValue = Decimal.Parse(
    scientificStr,
    NumberStyles.Float | NumberStyles.AllowExponent,
    CultureInfo.InvariantCulture
);

// 转成无科学计数法的格式输出,F0表示整数格式,带小数可以用F2/F4等
Console.WriteLine(decimalValue.ToString("F0")); // 打印 358000000000000

为什么Double.Parse会出问题?

Double是64位浮点数,只有53位有效二进制精度,换算成十进制大概是15-17位有效数字。当你的数值超过这个范围时(比如8.9148E+19有20位有效数字),Double无法精确存储每一位,只能近似表示,所以就会出现你看到的“四舍五入”现象。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:47:42