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

时间:2009-07-22 14:37:55

标签: c# double decimal precision currency

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

7 个答案:

答案 0 :(得分:968)

对于钱,总是十进制。这就是创建它的原因。

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

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

答案 1 :(得分:168)

  

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

decimal用于处理10 ^(+/- 28)范围内的值,以及基于基数10表示的行为预期 - 基本上是金钱。

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

  

哪种类型适合赚钱   计算

十进制,十进制十进制

不接受任何替代品。

最重要的因素是,作为二进制分数实现的double无法准确地表示所有的许多decimal分数(如0.1)及其总数数字较小,因为它是64位宽,而decimal是128位。最后,财务申请通常必须遵循具体的rounding modes(有时是法律规定的)。 decimal supports these; double没有。

答案 2 :(得分:38)

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

我使用错误的类型(好几年前)被蜇的方式很多:

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

你花了一百万来换一个花车。

15位数货币值:

  • £1,234,567,890,123.45

9万亿双。但是通过划分和比较,它更复杂(我绝对不是浮点数和无理数的专家 - see Marc's point)。混合小数和双精度会导致问题:

  

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

When should I use double instead of decimal? 有一些类似且更深入的答案。

使用double代替decimal 进行货币申请是微观优化 - 这是我看待它的最简单方法。

答案 3 :(得分:35)

十进制用于精确值。 Double是近似值。

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

答案 4 :(得分:26)

要钱:decimal。它会花费更多的内存,但不会像double那样有四舍五入的麻烦。

答案 5 :(得分:8)

绝对使用整数类型进行货币计算。这一点不够强调,因为乍一看似乎浮点类型就足够了。

这是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

答案 6 :(得分:5)

我认为位宽旁边的主要区别在于十进制有指数基数10而双数有2

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