我一直看到人们在 C#中使用双打。我知道我读到某个地方,双打有时会失去精确度。我的问题是什么时候应该使用双倍,何时应该使用小数类型?哪种类型适合货币计算? (即超过 1 亿美元)
为了钱, 总是小数。这就是为什么它被创造出来的原因。
如果数字必须正确加或平衡,请使用小数。这包括人们可能手工完成的任何财务存储或计算,分数或其他数字。
如果数字的确切值不重要,请使用 double 表示速度。这包括图形,物理或其他物理科学计算,其中已经存在 “有效位数”。
我的问题是什么时候应该使用双倍,何时应该使用小数类型?
当你使用 10 ^(+/- 28)范围内的值并且你对基于 10 的表示的行为有期望时的decimal
- 基本上是金钱。
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 位有效数字
我使用错误的类型(好几年前)被蜇的方式是大量的:
你花了一百万用于浮动。
15 位数的货币价值:
9 万亿双倍。但是通过划分和比较它会更复杂(我绝对不是浮点数和无理数的专家 - 请参阅 Marc 的观点 )。混合小数和双精度会导致问题:
如果使用十进制数,使用浮点数的数学或比较操作可能不会产生相同的结果,因为浮点数可能不完全接近十进制数。
什么时候应该使用 double 而不是 decimal?有一些类似和更深入的答案。
对货币应用程序使用double
而不是decimal
是一种微优化 - 这是我看待它的最简单方法。