您可以简化此Math.Ceiling表达式
decimal total
decimal? quantity, multiplier
int? days
total = (decimal)Math.Ceiling((double)quantity.Value * (double)days.Value * (double)multiplier);
编辑我忘了提到这是Silverlight代码,因此所有演员都变成了双。
答案 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);