在.net中,如何在Decimal和Double之间进行选择

Ian*_*ose 18 .net floating-point

我们前几天正在讨论这个问题,我希望有一个Stackoverflow问题,我会指点人们这样做.)

  • a Double和a有Decimal什么区别?
  • 何时(在什么情况下)你应该总是使用Double
  • 何时(在什么情况下)你应该总是使用Decimal
  • 什么是驱动因素的考虑在不属于上述两个阵营中的一个案例?

有很多问题与这个问题重叠,但他们倾向于询问某人在特定情况下应该做什么,而不是如何在一般情况下做出决定.

Jon*_*eet 36

我通常会考虑自然人工数量.

自然数量是重量,高度和时间.这些永远不会被绝对准确地测量,并且很少有任何绝对精确算术的想法:你通常不应该加起来,然后确保结果完全符合预期.使用double这种类型的数量.双打范围很广,但精度有限; 他们也非常快.

主要的人为数量是金钱.有一个"确切的10.52美元"的东西,如果你加48美分,你期望有11美元.使用decimal这种类型的数量.理由:鉴于它起初是人为的,所涉及的数字也是人为的,旨在满足人类需求 - 这意味着它们在基数10中自然表达.使存储表示与人类表示相匹配.decimal没有范围double,但大多数人工数量也不需要额外的范围.它也比较慢double,但我个人有一个银行账户,它给了我正确的答案,而不是一个错误的答案很快:)

有关更多信息,我有关于.NET二进制浮点类型.NET十进制类型的文章.(注意,它decimal也是浮点类型 - 但问题中的"点"是小数点,而不是二进制点.)


Fre*_*dou 6

如果你想保持真正的精确度,请保持小数

如果你想比较值,请保持小数

如果你使用double并执行此操作

? ctype(1.0, Double ) / 3
Run Code Online (Sandbox Code Playgroud)

你会得到

0.33333333333333331

如果你使用小数并执行此操作

? ctype(1.0, Decimal ) /3
Run Code Online (Sandbox Code Playgroud)

你会得到

0.3333333333333333333333333333D

还有一个例子,极端的一个;

  decimal dec = new decimal(1, 1, 1, false, 28);
  var dou = (double)dec;
Run Code Online (Sandbox Code Playgroud)

会产生这个,双倍会失去一些精确度

?dou
0.0000000018446744078004519
?dec
0.0000000018446744078004518913D

到底,

double =近似值

小数 =真实的东西

  • Ian 的评论是正确的 - 我已经知道 double 和 decimal 的行为,但是十进制为您提供“真正的精度”的想法对任何“真正的精度”的直观想法都具有误导性。 (2认同)