具有足够精度的数字类型,用于实现计算器

时间:2012-01-24 18:34:01

标签: c# .net types primitive-types

我正在构建一个WPF计算器应用程序,并在测试它时(与Windows内置计算器的行为相比)我看到了一些差异。

这是我的一个测试打印出来的:

  

测试'Comparison.Tests.ComparisonTests'失败:

     

预期字符串长度为17但是为16.字符串在索引16处有所不同。
  预计:“175641.7874709774”
    但是:“175641.787470977”

我使用 double 进行所有计算,最后将它们显示为TextBox的字符串。

这种差异的原因是什么?是否足以存储基本操作的结果(添加,乘法,减法,除法,SQRT等)。

5 个答案:

答案 0 :(得分:4)

如果您愿意接受其限制(15-16位精度),Double就足够了。

如果您使用Windows计算器作为黄金标准,您应该知道它不会在内部使用Double - rewritten in Windows 95使用任意精度算术库。每a blog post by Raymond Chen

  

今天,Calc的内部计算以基本操作(加法,减法,乘法,除法)的无限精度和高级操作(平方根,超越算子)的32位精度完成。

大多数应用程序的精度不需要超过15位数。如果你的话,你需要找到一个支持任意精度数学的库。

答案 1 :(得分:1)

使用decimal类型。它具有更高的精度。 Check this了解更多详情。

答案 2 :(得分:1)

Double类型为您提供大约15个十进制数字的精度,因此看起来您遇到了这个限制。 Decimal使用128位而不是像Double那样的64位,这样可以在相似的范围内提供更高的精度。

答案 3 :(得分:1)

我建议使用小数。

Why?

  

与float和double数据类型相反,小数小数   0.1之类的数字可以用十进制表示   表示。在float和double表示中,这样的数字   通常是无限的分数,使这些表示更容易发生   完成错误。

关于算术运算的一个很好的资源:What Every Computer Scientist Should Know About Floating-Point Arithmetic

答案 4 :(得分:0)

Double将为您提供53位精度(64位值为52位,大多数值为隐含的额外位)。

十进制将为您提供96位精度(128位值)。

前者的指数是二进制,后者的指数是十进制意味着double中的“round”数字对用户来说可能比十进制更令人惊讶。

另一方面,在需要表示无穷大或不是数字的上下文中,十进制表示效果不佳。

最有可能的是,十进制将提供更好的双倍。如果您需要更高的精度,可以通过组合BigInteger和数字来滚动自己的大小数来保持比例。