微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么 C# 会错误地计算双精度数和十进制数?

如何解决为什么 C# 会错误地计算双精度数和十进制数?

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

解决方法

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 };

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。