你能简化这个 Math.Ceiling 表达式吗
decimal total
decimal? quantity, multiplier
int? days
total = (decimal)Math.Ceiling((double)quantity.Value * (double)days.Value * (double)multiplier);
编辑我忘了提到这是 Silverlight 代码,因此所有的演员都是双重的。
为什么要将所有内容都转换为双倍?我会使用:
total = decimal.Ceiling(quantity.Value * days.Value * multiplier.Value);
(你可以Math.Ceiling(decimal)
改用,但我觉得decimal
如果你使用它会更清楚decimal.Ceiling
。)
将所有内容转换为双精度,在那里执行算术,然后转换回十进制很可能会丢失信息。您应该很少在双精度和十进制 IMO 之间进行转换。
您没有提供很多信息,但这是一个想法。
您使用可空类型(以 a 结尾的类型?
),但似乎并没有真正检查它们是否为空。(可能有你省略的代码)。如果您知道它们不会为空,请不要使用可为空的类型。这将摆脱.Value
您表达中的所有术语。
这会将您的表达式更改为:
total = (decimal)Math.Ceiling((double)quantity * (double)days * (double)multiplier);
我不知道你为什么要将每个乘数转换为double
. 我宁愿在转换为之前将它们全部相乘double
。(仔细检查是否有精度损失。)
这会将您的表达式更改为:
total = (decimal)Math.Ceiling((double)(quantity * days * multiplier));
总的来说,这对我来说看起来更简单,而且应该一样好。
(只有测试才能确定!)
怎么样:
decimal total;
decimal? quantity = null, multiplier = null;
int? days = null;
total = Math.Ceiling(quantity ?? 0 * days ?? 0 * multiplier ?? 0);