3

我对编程相当陌生,最近使用 C#(winforms)重新制作了微软的“标准”计算器,但想问一个关于微软在他们的“标准计算器”中使用的变量类型的问题。

为了确定使用的变量类型,我在微软标准计算器中输入了一个计算:

88888888/9(八个 8)。

结果为:9876543.111111111(小数点后 9 位)

然后,我创建了一个简单的 C# 控制台应用程序,该应用程序除以 2 个数字。

我首先使用“int”类型,如预期的那样,结果是 9876543。然后我使用“double”类型并且非常接近,结果是 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 输入为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;

如果我遗漏了一些非常明显的东西,请原谅我!最好的答案是告诉我微软在他们的标准计算器中使用什么变量类型,并提供某种形式的证据来支持这一点。另外,如果我在上面的代码中犯了任何错误,我们将不胜感激。

4

3 回答 3

3

精度为15-16 位。这就是为什么当你使用双精度时,你只有 8 位小数。小数精确到 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. 来自维基百科

在 Windows 95 及更高版本中,它使用任意精度的算术库,取代了标准的 IEEE 浮点库。它为基本运算(加法、减法、乘法、除法)提供 bignum 精度,为高级运算(平方根、超越运算符)提供 32 位精度。

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

于 2013-04-17T01:19:38.560 回答
2

如果你看 MSDN:<a href="http://msdn.microsoft.com/en-us/library/b1e65aza.aspx" rel="nofollow">http://msdn.microsoft.com/en-us /图书馆/b1e65aza.aspx。你会知道浮点数只有 7 位精度,在你的例子中是 9876543。

于 2013-04-17T01:17:40.710 回答
0

这就是你想要的

 Decimal.Divide(88888888,9);

此外,任何新开发人员(或任何相关人员)都应该阅读有关浮点运算的其他内容

于 2013-04-17T01:19:07.243 回答