2016-08-04 136 views
0

从我所理解的十进制数用于精度,推荐用于货币计算。 Double提供更好的范围,但精度更低,比小数快很多。C#十进制和双精度

如果我有时间和速度,我觉得双倍适合时间和小数的速率。我无法将这两者混合在一起并运行计算而无需投射,这又是一个性能瓶颈。这里最好的方法是什么?只需使用十进制的时间和速率?

+0

你是什么意思?毫秒?分钟 ?蜱?所有这些情况都是长或小数。 – user3185569

+4

最好的方法取决于您的要求。正如你还没有指定,那么你可能真的没有任何,这意味着去小数,继续前进。 – Will

+0

Persionally我认为['TimeSpan'](https://msdn.microsoft.com/en-us/library/system.timespan(v = vs.110).aspx)最适合时间。对于费率,这取决于你在做什么。 –

回答

0

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

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

最后,只有在一些非常具体的要求,你需要绝对速度的计算是进行了数百万次和其decimal碰巧不足够快,才把我想使用的另一种更快的类型我会首先尝试使用整数值(如果您有小数点,可以将您的值乘以10的幂),并且最后只能除以10的幂。如果不能这样做,只有我会想到使用double。如果您不确定是否需要,请不要做过早优化

+0

使用'double'不是不成熟的优化,它是更简单的选择。避免过早优化的重点是避免在你知道它是否值得它之前避免复杂化你的代码。试图使用'decimal'或者必须在整个地方扩展的整数类型是应该避免的不必要的复杂化。 – Kyle

+0

我觉得'小数点'是比较简单的,不会让人头疼。正如我上面所说的,浮点值有时会导致精度不足,产生像0.8000001或0.9999999这样的输出,或者像'0.1f == 0.1'这样的错误。所以你必须对这些类型更加小心。无论如何,我们几乎不知道什么是标志需求,所以这里都是猜测。 – Andrew

+0

我认为在这两种情况下都必须同样小心,因为'decimal'仍然是浮点类型,并且仍然受到舍入和截断错误的影响。它遇到了同样的问题,但在不同的情况下。所以我不同意这很简单。我认为这个建议让'decimal'看起来像是一个魔法子弹,当它不是。 – Kyle

1

两者都使用doubledecimal适用于货币或其他情况,其中数字的10为基数很重要。如果您不关心数字的10进制表示,请不要使用decimal。对于像物理量变化的时间或速率这样的事情,基10的表示通常不重要,因此decimal不是最合适的选择。

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