为什么C#计算双精度数和小数会错误?

问题描述 投票:0回答:1

我是 C# 的初学者,在学习基础知识的过程中,我偶然发现了一个问题:C# 错误地计算了两个小数/双精度数。我在这里做一个非常基本的计算器。比如我想把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!");
}
c# string double calculator data-conversion
1个回答
2
投票

Convert.ToDouble(String)
解析当前语言环境中的数字。因此,如果您的语言环境像大多数欧洲国家一样使用
.
对数字进行分组,并使用
,
作为小数点,那么
2.1
将被解析为 21,而
2,1
在英语国家中表示 2.1

因此,一种解决方案是输入您所在区域设置中的数字:

2,1
3,1
代替

或者您也可以通过使用

Convert.ToDouble
 重载
强制
Convert.ToDouble(String, IFormatProvider)

使用指定的区域设置
// 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
NumberFormatInfo provider = new NumberFormatInfo();
provider.NumberDecimalSeparator = ",";
provider.NumberGroupSeparator = ".";
provider.NumberGroupSizes = new int[] { 3 };
double num3 = Convert.ToDouble(Console.ReadLine(), provider);
© www.soinside.com 2019 - 2024. All rights reserved.