提问




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

    

            

  •             我什么时候应该使用double而不是decimal?
                    
                        12个答案
                    
            

  •     

最佳参考


对于钱,总是十进制。这就是创造它的原因。/questions/803225/when-should-i-use-double-instead-of-decimal


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


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

其它参考1



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



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


double当你需要相对准确度(即在大值上的尾随数字中丢失精度不是一个问题)时,差异很大 - double覆盖超过10 ^( +/- 300)。科学计算是这里最好的例子。



  哪种类型适合赚钱
  计算?



十进制,十进制,十进制


不接受任何替代品。


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

其它参考2


System.Single/float - 7位数

System.Double/double - 15-16位数

System.Decimal/decimal - 28-29有效数字[20] [21] [22] [23] [24] [25]


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



  • £520,532.52 - 8位数

  • £1,323,523.12 - 9位数



你花了100万用于漂浮物。


15位数的货币价值:



  • £1,234,567,890,123.45



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



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



什么时候应该使用double而不是decimal?有一些类似且更深入的答案。


使用double而不是decimal 进行货币申请是一种微观优化 - 这是我看待它的最简单方式。

其它参考3


十进制是精确值。 Double表示近似值。


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

其它参考4


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

其它参考5


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


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


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


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