C#decimal和double


C# decimal and double

据我所知,十进制用于精确计算,建议用于货币计算。double提供更好的范围,但精度较低,比decimal快得多。

如果我有时间和速率,我觉得double适合时间,decimal适合速率。我不能将这两种方法混合起来运行计算,而不进行强制转换,这又是另一个性能瓶颈。这里最好的方法是什么?只需使用小数表示时间和速率?


两者都使用doubledecimal用于货币或其他以10为基数表示数字很重要的情况。如果你不关心数字的基10表示,就不要使用decimal。对于时间或物理量变化率之类的事情,基本10表示通常不重要,因此decimal不是最合适的选择。

要认识到的重要一点是,decimal仍然是浮点类型。它仍然存在舍入误差,不能表示某些"简单"数字(如1/3)。它的一个优点(也是一个目的)是它可以精确地表示小于29位有效数字的十进制数。这意味着0.1或12345.6789这样的数字。基本上,任何一个十进制数字都可以用少于29位的数字写在纸上。如果你有一个重复的小数或者一个无理数,那么decimal就没有什么好处。


经验法则是使用更适合您将要处理的值的类型。这意味着您应该使用DateTimeTimeSpan作为时间,除非您只关心特定的单位,如秒、天等,在这种情况下,您可以使用任何整数类型。通常情况下,您需要精确,不希望因舍入而出现任何错误,因此我不会使用任何浮点类型,如floatdouble

对于任何与金钱有关的东西,当然你也不希望有任何舍入误差,所以你应该在这里使用decimal

最后,只有当对于一些非常具体的需求,在一个数百万次的计算中需要绝对速度,而对于这个计算,decimal恰好不够快,那么我才会考虑使用另一种更快的类型。我首先尝试使用整数值(如果你有小数,可以用你的值乘以10的幂),最后只除以10的幂。如果不能做到这一点,只有这样我才会考虑使用double。如果不确定是否需要,不要过早地进行优化。