协慌网

登录 贡献 社区

十进制 vs 双! - 我应该使用哪一个?何时使用?

我一直看到人们在 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 位有效数字

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

  • £520,532.52 - 8 位数
  • £1,323,523.12 - 9 位数

你花了一百万用于浮动。

15 位数的货币价值:

  • £1,234,567,890,123.45

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

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

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

对货币应用程序使用double而不是decimal是一种微优化 - 这是我看待它的最简单方法。