这个问题在这里已经有答案了:

我不断看到人们在 C# 中使用双精度。我知道我在某处读到双倍有时会失去精度。我的问题是什么时候应该使用双精度类型,什么时候应该使用十进制类型?哪种类型适合货币计算?(IE。超过 1 亿美元)

有帮助吗?

解决方案

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

如果数字必须正确相加或平衡,请使用小数。这包括任何财务存储或计算、分数或人们可能手工完成的其他数字。

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

其他提示

我的问题是什么时候应该使用双重,什么时候应该使用小数类型?

decimal 当您使用 10^(+/-28) 范围内的值并且您对基于 10 表示的行为有期望时 - 基本上是金钱。

double 当你需要的时候 相对的 准确性(即在大值的尾随数字中失去精度不是问题)在截然不同的幅度上 - double 覆盖超过 10^(+/-300)。科学计算就是最好的例子。

哪种类型适合货币计算?

小数, 小数, 小数

不接受替代品。

最重要的因素是 double, ,作为二进制分数实现,不能准确地表示许多 decimal 分数(如 0.1) 根本不 而且它的总位数更小,因为它是 64 位宽。128 位用于 decimal. 。最后,金融应用程序通常必须遵循特定的 舍入模式 (有时是法律规定的)。 decimal 支持这些; double 才不是。

系统.单一 / 漂浮 - 7 位数字
系统.双 / 双倍的 - 15-16位数字
系统.十进制 / 小数 - 28-29位有效数字

我因使用错误的类型(几年前)而被刺痛的方式是大量使用:

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

你用完了 100 万的浮点数。

15 位数字的货币价值:

  • £1,234,567,890,123.45

9万亿,翻倍。但是通过除法和比较,情况变得更加复杂(我绝对不是浮点数和无理数方面的专家 - 看看马克的观点)。混合小数和双精度会导致问题:

如果使用小数号,使用浮点数的数学或比较操作可能不会产生相同的结果,因为浮点数可能不会完全近似十进制数字。

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

使用 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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top