想知道为什么我们使用的这本书中使用了double和decimal而不是只用decimal。

3
我想知道为什么我们使用的这本书的例子在必要时使用小数和双精度浮点数混合,然后转换为小数。直接将所有内容都改为小数是否更简单,避免全部转换?
这是我感到好奇的主要代码段。
decimal amount;
decimal principal = 1000;
double rate = 0.05;

for (int year = 1; year <= 10; year++)
{
    amount = principal * ((decimal) Math.Pow(1.0 + rate, year));
}

我是否忽视了任何性能或准确性问题?


5
Math.Pow没有接受十进制数的重载。 - harold
3个回答

6

没有重载的 Math.Pow 可以使用 decimal - 实数的指数运算本质上是不准确的,因此不存在这样的重载也就说得通了。

现在由于唯一使用 rate 的地方是计算复合因子(Pow 调用),所以将其声明为 double 是有道理的 - 如果它只是被“强制转换掉”,更高的精度是没有帮助的。

其余的变量表示货币,这是 the 使用 decimal 的场景(这就是为什么 decimal 字面值后缀是 M)。可以想象另一个计算中添加了 $2.10commmisionamount 中 - 我们不希望为了一次麻烦(不准确)的复利计算而使这些计算不准确。

因此存在不一致性。


啊,原来如此。我理解了decimaldouble之间的主要区别,这也是我问的原因——我们已经在该方程中使用了十进制数,所以两者之间的性能提升有点无意义。谢谢。 - InsanityOnABun

2

Decimal的范围较小,但比double更精确。在.Net中,应该使用Decimal来表示货币。在您提供的示例中,amount和principal是货币值。而利率不是。因此,他们使用了正确的数据类型。

以下是关于Decimal的MSDN链接:MSDN Decimal


0

你应该阅读这个主题

归根结底,十进制用于货币或需要精确计算的场合,而双精度(double)更适用于科学计算,因为其性能更好。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接