我对编程很新,并且最近使用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();
从上面的信息,我会说微软使用类型“双”,因为它在小数位方面最接近.
但是..我不确定我的浮点类型代码中是否有错误. (如果上面的代码错误,你能告诉我吗?我故意输入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;
如果我错过了一些非常明显的东西,请原谅我!最好的答案是告诉我微软使用哪种变量类型的标准计算器,并提供某种形式的证据来支持它.此外,如果我在上面的代码中出现任何错误,将会感激任何更正.
解决方法:
double的精度为15-16位.这就是为什么当你使用双倍时,你只有8位小数. Decimals准确到28-29个有效数字,这就是为什么你得到的小数位数比你想要的多.如果要匹配Windows计算器并且有9位小数,则可以使用小数类型并使用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计算器显示不同精度的原因是因为它使用任意精度的算术库.从Wikipedia.
In Windows 95 and later, it uses an arbitrary-precision arithmetic
library, replacing the standard IEEE floating point library. It
offers bignum precision for basic operations (addition, subtraction,
multiplication, division) and 32 digits of precision for advanced
operations (square root, transcendental operators).
C#编译器不使用相同的任意精度库,这可能解释了结果的差异.