【问题标题】:Why does C# calculate double and decimal numbers wrongly?为什么 C# 会错误地计算双精度数和十进制数?
【发布时间】:2021-06-04 08:50:18
【问题描述】:

我是 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!");
}

【问题讨论】:

  • "计算两个十进制/双精度数错误。",哪部分出错了?精度错了吗?
  • 比如我想把2.1和3.1相加,结果是52,好像小数点不存在一样

标签: c# string double calculator data-conversion


【解决方案1】:

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

因此,一种解决方案是在您的语言环境中输入数字:2,13,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 };

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-13
    • 1970-01-01
    • 1970-01-01
    • 2014-02-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多