为什么 C# 会错误地计算双精度数和十进制数?
Why does C# calculate double and decimal numbers wrongly?
我是 C# 的初学者,在我学习基础知识的过程中,我偶然发现了一个问题,即 C# 计算了两个 decimal/double 数字错误。我在这里做一个非常基本的计算器。比如我想把2.1和3.1相加,结果就是52,好像没有小数点一样。
Console.Write("Enter a number: ");
double num1 = Convert.ToDouble(Console.ReadLine());
Console.Write("Enter Operator: ");
string op = Console.ReadLine();
Console.Write("Enter a second number: ");
double num2 = Convert.ToDouble(Console.ReadLine());
if (op == "+")
{
Console.Write(num1 + num2);
}
else if (op == "-")
{
Console.Write(num1 - num2);
}
else if (op == "/")
{
Console.Write(num1 / num2);
}
else if (op == "*")
{
Console.Write(num1 * num2);
}
else
{
Console.Write("Invalid operator!");
}
Convert.ToDouble(String)
解析 当前语言环境 中的数字。因此,如果您的语言环境使用 .
对数字进行分组,并且像大多数欧洲国家一样使用 ,
作为小数点,那么 2.1
将被解析为 21 而 2,1
在英语中表示 2.1 - 讲国家
因此,一种解决方案是在您的语言环境中输入数字:2,1
和 3,1
而不是
或者您也可以通过 Convert.ToDouble(String, IFormatProvider)
重载
强制 Convert.ToDouble
使用指定的语言环境
// Parse using the culture-independent format
double num1 = Convert.ToDouble(Console.ReadLine(), CultureInfo.InvariantCulture);
// Parse using German culture
double num2 = Convert.ToDouble(Console.ReadLine(), new CultureInfo("de-DE"));
// Parse using custom culture
double num3 = Convert.ToDouble(Console.ReadLine(), provider);
NumberFormatInfo provider = new NumberFormatInfo();
provider.NumberDecimalSeparator = ",";
provider.NumberGroupSeparator = ".";
provider.NumberGroupSizes = new int[] { 3 };
我是 C# 的初学者,在我学习基础知识的过程中,我偶然发现了一个问题,即 C# 计算了两个 decimal/double 数字错误。我在这里做一个非常基本的计算器。比如我想把2.1和3.1相加,结果就是52,好像没有小数点一样。
Console.Write("Enter a number: ");
double num1 = Convert.ToDouble(Console.ReadLine());
Console.Write("Enter Operator: ");
string op = Console.ReadLine();
Console.Write("Enter a second number: ");
double num2 = Convert.ToDouble(Console.ReadLine());
if (op == "+")
{
Console.Write(num1 + num2);
}
else if (op == "-")
{
Console.Write(num1 - num2);
}
else if (op == "/")
{
Console.Write(num1 / num2);
}
else if (op == "*")
{
Console.Write(num1 * num2);
}
else
{
Console.Write("Invalid operator!");
}
Convert.ToDouble(String)
解析 当前语言环境 中的数字。因此,如果您的语言环境使用 .
对数字进行分组,并且像大多数欧洲国家一样使用 ,
作为小数点,那么 2.1
将被解析为 21 而 2,1
在英语中表示 2.1 - 讲国家
因此,一种解决方案是在您的语言环境中输入数字:2,1
和 3,1
而不是
或者您也可以通过 Convert.ToDouble(String, IFormatProvider)
重载
Convert.ToDouble
使用指定的语言环境
// Parse using the culture-independent format
double num1 = Convert.ToDouble(Console.ReadLine(), CultureInfo.InvariantCulture);
// Parse using German culture
double num2 = Convert.ToDouble(Console.ReadLine(), new CultureInfo("de-DE"));
// Parse using custom culture
double num3 = Convert.ToDouble(Console.ReadLine(), provider);
NumberFormatInfo provider = new NumberFormatInfo();
provider.NumberDecimalSeparator = ",";
provider.NumberGroupSeparator = ".";
provider.NumberGroupSizes = new int[] { 3 };