.NET: Можете ли вы упростить это выражение Math.Ceiling - PullRequest
1 голос
/ 14 января 2011

Можете ли вы упростить это выражение Math.Ceiling

decimal total
decimal? quantity, multiplier
int? days

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

РЕДАКТИРОВАТЬ Я забыл упомянуть, что это код Silverlight, поэтому все преобразуются в двойные.

Ответы [ 3 ]

12 голосов
/ 14 января 2011

Почему вы хотите конвертировать все в удвоение? Я бы использовал:

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

(вместо этого можно использовать Math.Ceiling(decimal), но я чувствую, что более понятно, что он использует decimal, если вы используете decimal.Ceiling.)

Преобразование всего в удвоение, выполнение арифметики там, а затем обратное преобразование в десятичное с большой вероятностью приведет к потере информации. Вы должны очень, очень редко конвертировать между двойным и десятичным ИМО.

0 голосов
/ 14 января 2011

Как насчет:

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

total = Math.Ceiling(quantity ?? 0 * days ?? 0 * multiplier ?? 0);
0 голосов
/ 14 января 2011

Вы не предоставили много информации, но вот одна идея.

Вы используете Nullable Types (типы, оканчивающиеся на ?), но, похоже, на самом деле не проверяете, являются ли они пустыми. (Возможно, вы пропустили код). Если вы знаете, что они не будут нулевыми, не используйте обнуляемые типы. Это избавит вас от всех .Value терминов в вашем выражении.

Это изменит ваше выражение на:

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

Я не знаю, почему вы приводите каждый множитель к double. Я бы предпочел умножить их все вместе перед тем, как привести к double. (внимательно проверьте на предмет потери точности.)

Это изменит ваше выражение на:

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

В целом, это выглядит проще для меня и должно быть таким же хорошим.
(только тестирование точно скажет!)

...