C# 具有足够精度以实现计算器的数字类型

C# 具有足够精度以实现计算器的数字类型,c#,.net,types,primitive-types,C#,.net,Types,Primitive Types,我正在构建一个WPF计算器应用程序,在测试它与Windows内置计算器的行为时,我发现了一些差异 这是我的一个测试的打印件: 测试“Comparison.Tests.ComparisonTests”失败: 预期字符串长度为17,但为16。字符串在索引16处不同。 预计:175641.7874709774 但是是:175641.787470977 我在所有计算中都使用了double,并最终将它们显示为文本框中的字符串 这种差异的原因是什么?double不足以存储加法、乘法、减法、除法、SQRT等基

我正在构建一个WPF计算器应用程序,在测试它与Windows内置计算器的行为时,我发现了一些差异

这是我的一个测试的打印件:

测试“Comparison.Tests.ComparisonTests”失败:

预期字符串长度为17,但为16。字符串在索引16处不同。 预计:175641.7874709774 但是是:175641.787470977

我在所有计算中都使用了double,并最终将它们显示为文本框中的字符串


这种差异的原因是什么?double不足以存储加法、乘法、减法、除法、SQRT等基本运算的结果。

使用十进制类型。它更精确。有关详细信息。

请使用十进制类型。它更精确。有关更多详细信息。

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

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

如果您愿意接受Double的15-16位精度限制,它就足够了

如果您使用Windows Calculator作为金标准,您应该知道它在内部不使用Double,而是使用任意精度的算术库。Per:

今天,Calc的内部计算以无限精度完成基本运算加法、减法、乘法、除法,以及高级运算平方根、超越运算符的32位精度


大多数应用不需要超过15位的精度。如果您的库支持任意精度的数学运算,那么您需要找到一个支持任意精度数学运算的库。

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

如果您使用Windows Calculator作为金标准,您应该知道它在内部不使用Double,而是使用任意精度的算术库。Per:

今天,Calc的内部计算以无限精度完成基本运算加法、减法、乘法、除法,以及高级运算平方根、超越运算符的32位精度


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

我建议使用十进制

与浮点和双精度数据类型相反,十进制小数 像0.1这样的数字可以精确地用十进制表示 代表性。在float和double表示法中,这样的数字 通常是无限分数,这使得这些表示更容易出现 弥补错误


关于算术运算的一个很好的资源:

我建议使用十进制

与浮点和双精度数据类型相反,十进制小数 像0.1这样的数字可以精确地用十进制表示 代表性。在float和double表示法中,这样的数字 通常是无限分数,这使得这些表示更容易出现 弥补错误


关于算术运算的一个很好的资源:

Double将在64位值中为您提供53位精度52位,大多数值都有一个隐式额外位

十进制将在128位值中提供96位精度

前者的指数是二进制的,而后者的指数是十进制的,这意味着double中的整数比decimal中的整数更令人惊讶

另一方面,在需要表示无穷大或非数字的上下文中,十进制并不好用


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

Double将在64位值中为您提供53位精度52位,对于大多数值,会有一个隐式的额外位

十进制将在128位值中提供96位精度

前者的指数是二进制的,而后者的指数是十进制的,这意味着double中的整数比decimal中的整数更令人惊讶

另一方面,在需要表示无穷大或非数字的上下文中,十进制并不好用


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

您可能会更幸运。您可能会更幸运。在这种情况下,十进制不是一个简单的解决方案?十进制有28-29位精度,比D高
双数是15-16,但仍然是有限的。它可能会使这个特定的测试用例通过,但它不会给你的应用程序提供Windows Calculator所能提供的无限精度,因此如果你使用Windows Calculator作为参考点,你将有更多的测试失败。在这种情况下,十进制不是一个简单的解决方案?十进制有28-29位精度,这比15-16的两倍还多,但仍然是有限的。它可能会使这个特定的测试用例通过,但它不会给你的应用程序提供Windows Calculator所能提供的无限精度,因此如果你使用Windows Calculator作为参考点,你将有更多的测试失败。