十进制与双精度! - 应该使用哪一个?何时使用?

我一直看到人们在 C#中使用双打。我知道我在某个地方读过一些内容,有时会失去精度。我的问题是什么时候应该使用双精度型,什么时候应该使用十进制型?哪种类型适合货币计算? (即超过 1 亿美元)

答案

为了钱, 总是十进制。这就是它被创建的原因。

如果数字必须正确加总或保持平衡,请使用十进制。这包括人们可能手工进行的任何财务存储或计算,分数或其他数字。

如果数字的确切值不重要,请使用 double 作为速度。这包括图形,物理学或其他物理科学计算,其中已经有 “有效位数”。

我的问题是什么时候应该使用双精度型,什么时候应该使用十进制型?

当您使用 10 ^(+/- 28)范围内的值以及对基于基数 10 表示形式的行为有期望的情况时 - 基本上是decimal

double的,当你需要相对精确度(即在大的值后的数字失去精度不是问题)跨越很大的不同幅度 - double覆盖超过 10 ^(+/- 300)。科学计算是最好的例子。

哪种类型适合货币计算?

十进制, 十进制十进制

不接受替代品。

最重要的因素是,以二进制分数形式实现的double根本无法准确表示许多decimal分数(例如 0.1) 并且其总位数较小,因为它的宽度为 64 位,而decimal为 128 位。最后,财务申请通常必须遵循特定的舍入模式 (有时是法律规定的)。 decimal 支持这些 ; double没有。

System.Single / float -7 digits
System.Double / double -15-16 digits
System.Decimal / decimal -28-29 有效数字

我使用错误的类型(几年前)感到 ung 恼的方式有很多:

  • £520,532.52-8 位数字
  • £1,323,523.12-9 位数字

您以一百万的价格用完了。

15 位货币值:

  • 1,234,567,890,123.45 英镑

9 万亿加倍。但是通过除法和比较,它变得更加复杂(我绝对不是浮点数和非理性数的专家 - 参见 Marc 的观点 )。混合使用小数和双精度会导致问题:

如果使用十进制数,则使用浮点数的数学或比较运算可能不会产生相同的结果,因为浮点数可能不完全近似于十进制数。

什么时候应该使用双精度而不是十进制?有一些相似且更深入的答案。

对于货币应用程序,使用double精度而不是decimal是一种微优化 - 这是我最简单的方法。

小数表示精确值。 Double 是近似值。

USD: $12,345.67 USD (Decimal)
CAD: $13,617.27 (Decimal)
Exchange Rate: 1.102932 (Double)

金钱: decimal 。它的费用多一点的内存,但没有四舍五入的烦恼像double有时也有。

绝对使用整数类型进行货币计算。由于乍看起来似乎浮点类型已足够,因此不能足够强调。

这是 python 代码中的示例:

>>> amount = float(100.00) # one hundred dollars
>>> print amount
100.0
>>> new_amount = amount + 1
>>> print new_amount
101.0
>>> print new_amount - amount
>>> 1.0

看起来很正常。

现在再用 10 ^ 20 津巴布韦元尝试一下

>>> amount = float(1e20)
>>> print amount
1e+20
>>> new_amount = amount + 1
>>> print new_amount
1e+20
>>> print new_amount-amount
0.0

如您所见,美元消失了。

如果使用整数类型,则可以正常工作:

>>> amount = int(1e20)
>>> print amount
100000000000000000000
>>> new_amount = amount + 1
>>> print new_amount
100000000000000000001
>>> print new_amount - amount
1

我认为除位宽外的主要区别是十进制的指数基数为 10,双精度数为 2

http://software-product-development.blogspot.com/2008/07/net-double-vs-decimal.html