我对编程很新,最近使用C#(winforms)重新制作了微软“标准”计算器,但想问一个关于微软在“标准计算器”中使用的变量类型的问题。
为了确定使用的变量类型,我在微软标准计算器中输入了一个计算:
88888888/9(8月8日)。
结果是:9876543.111111111(小数点后9位)
然后我创建了一个简单的C#控制台应用程序,它将2个数字分开。
我首先使用“int”类型,正如预期的那样,结果是9876543。 然后我使用“双”类型并且非常接近,结果是9876543.11111111(小数点后8位) 我使用了十进制和输出(再次,如预期)有太多的小数位! 我使用了float,输出与int类型(9876543)相同。
float a = 88888888F;
float b = 9F;
float c = 0F;
Console.WriteLine("a / b is: {0}", c = a / b);
Console.ReadLine();
从上面的信息中,我会说微软使用类型“double”,因为它在小数位上最接近。
但是......我不确定我的浮点类型代码中是否有错误。 (你能告诉我上面的代码是不是错了吗?我故意输入casted float to float,以防万一,但最初没有,最后仍然得到相同的结果)
我已尝试过此链接以获取有关浮点类型的一些信息,但实际上没有多大帮助:http://msdn.microsoft.com/en-gb/library/b1e65aza(v=vs.100).aspx
然后我尝试了C ++,得到了类似的结果。
float a = 88888888;
float b = 9;
float c = a / b;
cout << c;
double aa = 88888888;
double bb = 9;
double cc = aa / bb;
cout << cc;
如果我错过了一些非常明显的东西,请原谅我!最好的答案是告诉我微软使用哪种变量类型的标准计算器,并提供某种形式的证据来支持它。此外,如果我在上面的代码中出现任何错误,我们将不胜感激。
答案 0 :(得分:3)
double的精度为15-16位。这就是为什么当你使用双倍时,你只有8位小数。 Decimals精确到28-29个有效数字,这就是为什么你得到的小数位数比你想要的多。如果您想匹配Windows计算器并且有9个小数位,您可以使用decimal
类型并使用Decimal.Round()将其设置为9位小数。
decimal a = 88888888;
decimal b = 9;
decimal c = 0;
Console.WriteLine("a / b is: {0}", Decimal.Round(c = a / b, 9) );
Console.ReadLine();
编辑 -
Windows计算器显示不同程度的准确性的原因是因为它使用了arbitrary-precision arithmetic library
。来自Wikipedia。
在Windows 95及更高版本中,它使用任意精度算术 库,替换标准的IEEE浮点库。它 为基本操作提供bignum精度(加法,减法, 乘法,除法)和高级的32位精度 操作(平方根,超越算子)。
C#编译器不使用相同的任意精度库,这可能解释了结果的差异。
答案 1 :(得分:2)
如果您查看MSDN:http://msdn.microsoft.com/en-us/library/b1e65aza.aspx。你会知道浮点数只有7位精度,在你的情况下是9876543。
答案 2 :(得分:0)