.NET:你能简化这个Math.Ceiling表达式吗?

时间:2011-01-14 19:39:11

标签: c# .net math ceiling

您可以简化此Math.Ceiling表达式

decimal total
decimal? quantity, multiplier
int? days

total = (decimal)Math.Ceiling((double)quantity.Value * (double)days.Value * (double)multiplier);

编辑我忘了提到这是Silverlight代码,因此所有演员都变成了双。

3 个答案:

答案 0 :(得分:12)

为什么要将所有内容转换为双倍?我会用:

total = decimal.Ceiling(quantity.Value * days.Value * multiplier.Value);

(您可以使用Math.Ceiling(decimal)代替,但如果您使用decimal.Ceiling,我会觉得使用decimal更清楚。)

将所有内容转换为double,在那里执行算术,然后转换回十进制很可能会丢失信息。您应该非常非常少地在双倍和十进制IMO之间进行转换。

答案 1 :(得分:0)

您没有提供大量信息,但这是一个想法。

您使用Nullable Types(以?结尾的类型),但似乎并未实际检查它们是否为null。 (可能有您省略的代码)。如果您知道它们不为null,请不要使用可空类型。这将消除表达式中的所有.Value个术语。

这会将您的表达式更改为:

total = (decimal)Math.Ceiling((double)quantity * (double)days * (double)multiplier);

我不知道为什么要将每个乘数投射到double。在转换为double之前,我宁愿将它们全部放在一起。 (仔细检查精确度。)

这会将您的表达式更改为:

total = (decimal)Math.Ceiling((double)(quantity * days * multiplier));

总的来说,这对我来说看起来更简单,也应该一样好 (只有测试才能确定!)

答案 2 :(得分:0)

怎么样:

decimal total;
decimal? quantity = null, multiplier = null;
int? days = null;

total = Math.Ceiling(quantity ?? 0 * days ?? 0 * multiplier ?? 0);