十进制vs双!-我应该使用哪个以及何时使用?

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

533121 次浏览

对于金钱:decimal。它花费了更多的内存,但没有像double有时那样的舍入麻烦。

为了钱,总是十进制。这就是为什么它被创建。

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

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

肯定是的使用整数类型进行货币计算。
这一点怎么强调都不为过,因为乍一看,浮点类型似乎就足够了。

下面是python代码中的一个示例:

>>> amount = float(100.00) # one hundred dollars>>> print amount100.0>>> new_amount = amount + 1>>> print new_amount101.0>>> print new_amount - amount>>> 1.0

看起来很正常。

现在用10^20津巴布韦元再试一次:

>>> amount = float(1e20)>>> print amount1e+20>>> new_amount = amount + 1>>> print new_amount1e+20>>> print new_amount-amount0.0

如你所见,美元消失了。

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

>>> amount = int(1e20)>>> print amount100000000000000000000>>> new_amount = amount + 1>>> print new_amount100000000000000000001>>> print new_amount - amount1

十进制表示精确值。双精度表示近似值。

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

我的问题是什么时候应该使用双精度和何时使用小数类型?

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

当您需要相对精度(即在大值的尾随数字中失去精度不是问题)时,double适用于完全不同的量值-double涵盖超过10^(+/-300)。科学计算是这里最好的例子。

什么类型的钱适合计算?

十进制,十进制十进制

不接受替代品。

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

根据浮点类型的特性

. NET类型C#关键字精度
System.Single浮动~6-9位
System.Double双倍~15-17位
System.Decimal十进制28-29位

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

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

你跑去100万买花车。

15位货币价值:

  • £1,234,567,890,123.45

9万亿双精度。但是除法和比较更复杂(我绝对不是浮点数和无理数的专家-看看Marc的观点)。混合小数和双精度会导致问题:

一种数学运算或比较运算使用浮点数可能不会产生相同的结果,如果使用十进制数是因为浮点数可能不会精确地接近小数号码。

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

使用double而不是decimal用于货币应用是一种微优化-这是我看待它的最简单方式。

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

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