1

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

decimal total
decimal? quantity, multiplier
int? days

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

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

4

3 回答 3

12

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

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

(你可以Math.Ceiling(decimal)改用,但我觉得decimal如果你使用它会更清楚decimal.Ceiling。)

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

于 2011-01-14T19:41:08.640 回答
0

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

您使用可空类型(以 a 结尾的类型?),但似乎并没有真正检查它们是否为空。(可能有你省略的代码)。如果您知道它们不会为空,请不要使用可为空的类型。这将摆脱.Value您表达中的所有术语。

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

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

我不知道你为什么要将每个乘数转换为double. 我宁愿在转换为之前将它们全部相乘double。(仔细检查是否有精度损失。)

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

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

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

于 2011-01-14T19:46:41.887 回答
0

怎么样:

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

total = Math.Ceiling(quantity ?? 0 * days ?? 0 * multiplier ?? 0);
于 2011-01-14T19:53:57.623 回答