为何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
相关产品推荐
相关产品推荐

