在Visual Studio中使用C#实现双精度浮点数相加结果异常的求助
解决C#中double数字相加时小数点分隔符导致的错误
这个问题我太熟了!本质是区域文化设置在搞鬼~
你遇到的情况是因为你的系统当前区域配置把**逗号(,)**作为小数点分隔符,而不是点(.):
- 当输入
2.4时,Convert.ToDouble会把点当成千位分隔符直接忽略,所以2.4被解析成了24,4.5被解析成45,加起来自然是69; - 当输入
2,4时,刚好匹配系统区域的小数点分隔符,所以能正确解析为2.4和4.5,相加得到6.9。
解决方案
这里给你两种靠谱的处理方式:
1. 使用不变文化(InvariantCulture)强制解析点作为小数点
不管系统区域是什么,InvariantCulture都会把点(.)当作小数点分隔符,适合做通用程序。
修改后的代码如下(记得引用System.Globalization命名空间):
using System; using System.Globalization; namespace DoubleAdditionFix { class Program { static void Main(string[] args) { Console.Write("Enter a number: "); double num1 = Convert.ToDouble(Console.ReadLine(), CultureInfo.InvariantCulture); Console.Write("Enter another number: "); double num2 = Convert.ToDouble(Console.ReadLine(), CultureInfo.InvariantCulture); Console.WriteLine(num1 + num2); Console.ReadLine(); } } }
2. 用double.TryParse做更安全的解析(推荐)
TryParse可以避免输入无效格式时程序崩溃,还能友好提示用户重新输入:
using System; using System.Globalization; namespace DoubleAdditionFix { class Program { static void Main(string[] args) { double num1; Console.Write("Enter a number (use . as decimal separator): "); // 循环直到输入有效数字 while (!double.TryParse(Console.ReadLine(), NumberStyles.Float | NumberStyles.AllowThousands, CultureInfo.InvariantCulture, out num1)) { Console.WriteLine("Invalid input! Please enter a valid number with . as decimal separator."); Console.Write("Try again: "); } double num2; Console.Write("Enter another number (use . as decimal separator): "); while (!double.TryParse(Console.ReadLine(), NumberStyles.Float | NumberStyles.AllowThousands, CultureInfo.InvariantCulture, out num2)) { Console.WriteLine("Invalid input! Please enter a valid number with . as decimal separator."); Console.Write("Try again: "); } Console.WriteLine($"Result: {num1 + num2}"); Console.ReadLine(); } } }
额外说明
如果你的程序是给特定区域用户使用(比如只面向使用逗号做小数点的地区),也可以指定对应区域的CultureInfo(比如new CultureInfo("fr-FR")代表法语区),但通用场景下优先用InvariantCulture。
内容的提问来源于stack exchange,提问作者ivan_stack
相关产品推荐
相关产品推荐

