我应该使用哪一个和什么时候?
这个问题在这里已经有了答案:
对于金钱, 总是小数。 这就是它被创造的原因。
如果数字必须正确合计或平衡,请使用小数。 这包括任何财务存储或计算,分数或人们可能手动完成的其他数字。
如果数字的确切值不重要,请使用double来表示速度。 这包括图形,物理或其他物理科学计算,其中已经有“有效位数”。
我的问题是什么时候应该使用双精度型,什么时候应该使用小数型?
decimal
,当你使用10 ^(+/- 28)范围内的值时,以及你对基于10次表示的行为有预期 - 基本上是金钱。
double
当你需要相对精确度(即在大的值的结尾数字失去精度不是问题)跨越很大的不同幅度- double
覆盖超过10 ^(+/- 300)。 科学计算是最好的例子。
哪种类型适合金钱计算?
十进制,十进制, 十进制
不接受替代品。
最重要的因素是,作为二进制小数实现的double
,根本不能准确地表示许多decimal
部分(如0.1),其整数位数较小,因为它是64位宽,而decimal
位是128位。 最后,金融应用通常必须遵循特定的舍入模式(有时由法律授权)。 decimal
支持这些; double
不。
System.Single / float - 7位数字
System.Double / double - 15-16位数
System.Decimal / decimal - 28-29有效数字
使用错误类型(好几年前)我被蜇伤的方式有很多:
你花了100万美元买了一个浮动。
15位货币价值:
9万亿加倍。 但通过分割和比较,它更加复杂(我绝对不是浮点数和无理数的专家 - 请参阅Marc的观点)。 混合小数和双打会导致问题:
如果使用十进制数字,则使用浮点数字的数学或比较操作可能不会产生相同的结果,因为浮点数字可能不是十分接近十进制数字。
什么时候应该使用double而不是小数? 有一些相似和更深入的答案。
对货币应用使用double
精度而不是decimal
是一种微观优化 - 这是我观察它的最简单的方法。