2013-04-17 34 views
2

我是相当新的编程,并且最近重新使用C#(winforms)微软“标准”计算器,但想问一个关于微软在其“标准计算器”中使用的变量类型的问题, 。微软标准计算器中使用的变量类型

要确定所使用的变量的类型,我在Microsoft标准计算器输入的计算:

9分之88888888(8个8的)。

其结果是:9876543.111111111(9位小数)

我然后创建划分2个号码一个简单的C#控制台应用程序。

我第一次使用了“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(); 

从上面的信息,我会说微软使用类型“双”,因为这是最接近的小数位数。

但是..我不知道如果我在我的浮点类型的代码中做了错误。 (你们可以让我知道如果上面的代码是错误的吗?我故意键入流延浮动浮动,以防万一,但最初没有,并在结尾仍然得到相同的结果)

我试过这个链接关于浮点类型的一些信息,但并没有真正的帮助: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; 

请原谅我,如果我失去了一些疯狂明显的东西!最好的答案是告诉我微软使用哪种变量类型作为他们的标准计算器,并提供某种形式的证据来支持它。此外,如果我在上面的代码中发现了任何错误,我将不胜感激。

回答

2

精度为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浮点库。它为 操作(平方根,超越算子)提供基本操作(加法,减法, 乘法,除法)和32位精度的精度。

C#编译器不使用相同的任意精度库,这可能会解释结果的差异。

+0

嘿,谢谢你,我不想手动告诉我的计算器从结果中切断多少个小数位。我只是想知道为什么微软计算器给了我一个答案,该公式为9位小数,为什么我的C#代码给了我8位小数。 – Zak

+0

@Zak - 我已经更新了我的答案。这可能解释结果的差异。 – keyboardP

+0

嘿,这很有道理!非常感谢!!当我开始编写这个计算器时,我认为这将是一块蛋糕,但实际上它比我想象的复杂得多! – Zak

2

如果你看看MSDN:http://msdn.microsoft.com/en-us/library/b1e65aza.aspx。你会知道浮法只有7位的精度,这在你的情况下,是9876543.

+0

谢谢,这个排除了浮动作为微软计算器使用的类型。我会给你一个有用的分数,但需要15分大声笑。 – Zak

0
+0

嘿,非常感谢这个回应,但是和上面一样,我不想手动告诉我的计算器将小数点后9位数进行舍入,对microsoft calculator如何显示9位小数点以及c#代码显示8位小数点的方式/ 。 – Zak

+0

这个计算器可以做到这一点,据我所知。更改为科学模式,并做同样的事情...你得到更多的1:9876543.1111111111111111111111111 –

+0

嘿,我唯一的问题是,如果我有另一个方程,如88888888/6,为什么微软计算给:14814814.66666667(8十月)和我的c#应用程序给:14814814.6666667(7十二月)。我的观点是,它当然不能说“在9个十进位中断”(我也通过不断划分一个数字并得到了10位小数的答案来测试) – Zak