我正在构建一个WPF计算器应用程序,并在测试它时(与Windows内置计算器的行为相比)我看到了一些差异。
这是我的一个测试打印出来的:
测试'Comparison.Tests.ComparisonTests'失败:
预期字符串长度为17但是为16.字符串在索引16处有所不同。
预计:“175641.7874709774”
但是:“175641.787470977”
我使用 double 进行所有计算,最后将它们显示为TextBox的字符串。
这种差异的原因是什么?是否足以存储基本操作的结果(添加,乘法,减法,除法,SQRT等)。
答案 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)
我建议使用小数。
与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
和数字来滚动自己的大小数来保持比例。