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

为何C#中转换为Double会导致大整数末尾两位被舍入?

static void Main()
{
   var result1 = Converter.ConvertToInt32("922336666");
   //result1 返回值为 922336666
   var result2 = Converter.ConvertToInt64("92233720368547758");
   //result2 返回值为 92233720368547760
}
}
public static class Converter {
    public static int ConvertToInt32(string input) {
        return Convert.ToInt32(Math.Round(Convert.ToDouble(input)));
    }
    public static Int64 ConvertToInt64(string input)
    {
        return Convert.ToInt64(Math.Round(Convert.ToDouble(input)));
    }
}
问题原因分析

出现这种舍入是因为Double类型的精度限制:

  • Double遵循IEEE 754双精度标准,它的有效存储位数是53位二进制,对应十进制大约是15-17位。也就是说,只有当十进制整数的位数≤15时,Double才能精确表示;超过这个范围的整数,无法被Double精准存储,会被自动近似到最近的可表示值。

  • 第一个例子922336666是10位十进制,远低于15位的精度上限,所以转换为Double时能保持精确,最终结果和原数一致。

  • 第二个例子92233720368547758是17位十进制,已经超出了Double的精确表示范围。当你把它转成Double时,这个数会被近似为92233720368547760(这是Double能精确表示的最近值),后续的Math.Round和转Int64操作自然就得到了这个近似值。

正确的解决方案

如果需要精确转换大整数字符串,应该直接使用Int64.TryParse或者Convert.ToInt64,跳过Double转换这一步——因为Double的精度限制必然会导致大整数信息丢失:

public static Int64 ConvertToInt64(string input)
{
    // 直接转换,避免Double精度问题
    return Convert.ToInt64(input);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 16:21:50