我一直看到人们在C#中使用双精度。我知道我在某处读到双精度有时会失去精度。我的问题是什么时候应该使用双精度,什么时候应该使用十进制类型?哪种类型适合货币计算?(即大于1亿美元)
对于金钱:decimal。它花费了更多的内存,但没有像double有时那样的舍入麻烦。
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津巴布韦元再试一次:
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没有。
根据浮点类型的特性:
System.Single
System.Double
System.Decimal
我被使用错误类型(几年前)刺痛的方式是大量:
你跑去100万买花车。
15位货币价值:
9万亿双精度。但是除法和比较更复杂(我绝对不是浮点数和无理数的专家-看看Marc的观点)。混合小数和双精度会导致问题:
一种数学运算或比较运算使用浮点数可能不会产生相同的结果,如果使用十进制数是因为浮点数可能不会精确地接近小数号码。
什么时候应该使用双精度而不是十进制?有一些类似的、更深入的答案。
使用double而不是decimal用于货币应用是一种微优化-这是我看待它的最简单方式。
我认为除了位宽之外的主要区别是十进制有指数基数10,双进制有2
http://software-product-development.blogspot.com/2008/07/net-double-vs-decimal.html