Ian*_*ose 18 .net floating-point
我们前几天正在讨论这个问题,我希望有一个Stackoverflow问题,我会指点人们这样做.)
Double和a有Decimal什么区别?Double?Decimal?有很多问题与这个问题重叠,但他们倾向于询问某人在特定情况下应该做什么,而不是如何在一般情况下做出决定.
Jon*_*eet 36
我通常会考虑自然与人工数量.
自然数量是重量,高度和时间.这些永远不会被绝对准确地测量,并且很少有任何绝对精确算术的想法:你通常不应该加起来,然后确保结果完全符合预期.使用double这种类型的数量.双打范围很广,但精度有限; 他们也非常快.
主要的人为数量是金钱.有一个"确切的10.52美元"的东西,如果你加48美分,你期望有11美元.使用decimal这种类型的数量.理由:鉴于它起初是人为的,所涉及的数字也是人为的,旨在满足人类需求 - 这意味着它们在基数10中自然表达.使存储表示与人类表示相匹配.decimal没有范围double,但大多数人工数量也不需要额外的范围.它也比较慢double,但我个人有一个银行账户,它给了我正确的答案,而不是一个错误的答案很快:)
有关更多信息,我有关于.NET二进制浮点类型和.NET十进制类型的文章.(注意,它decimal也是浮点类型 - 但问题中的"点"是小数点,而不是二进制点.)
如果你想保持真正的精确度,请保持小数
如果你想比较值,请保持小数
如果你使用double并执行此操作
? ctype(1.0, Double ) / 3
你会得到
0.33333333333333331
如果你使用小数并执行此操作
? ctype(1.0, Decimal ) /3
你会得到
0.3333333333333333333333333333D
还有一个例子,极端的一个;
  decimal dec = new decimal(1, 1, 1, false, 28);
  var dou = (double)dec;
会产生这个,双倍会失去一些精确度
?dou
0.0000000018446744078004519
?dec
0.0000000018446744078004518913D
到底,
double =近似值
小数 =真实的东西
| 归档时间: | 
 | 
| 查看次数: | 1089 次 | 
| 最近记录: |