我一直看到人们在C#中使用双打。我知道我读到某个地方,双打有时会失去精确度。 我的问题是什么时候应该使用双倍,何时应该使用小数类型? 哪种类型适合货币计算? (即超过1亿美元)
答案 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位有效数字
我使用错误的类型(好几年前)被蜇的方式很多:
你花了一百万来换一个花车。
15位数货币值:
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