C # Вычисление двух столбцов базы данных возвращает ноль [дубликат]

SK2017 спросил: 28 апреля 2018 в 09:28 в: c#

У этого вопроса уже есть ответ:

  • Division returns zero 6 ответов

Я запускаю простой запрос и вычисляет процент двух значений. Каждый раз, когда этот пробег вычисляется, возвращается ноль. Вычисление также преобразуется в десятичное число, поэтому я не вижу, в чем проблема.

from e in db.hours
select new
{
    OverTimeHoursPercentage = (decimal)((1088 / 22000) * 100)
};

После запуска запроса я вижу в отладчике тип OverTimeHoursPercentage - это decimal, и вычисляемое значение равно нулю, когда оно должно быть 4.94.

Любые идеи о том, что происходит?

2 ответа

Есть решение
David ответил: 28 апреля 2018 в 09:33

1088 и 22000 являются целыми числами, а с целым числом math 1088 / 22000 является 0. 0 * 100 также 0. И при преобразовании в десятичный код 0 является 0.0.

Что вы хотите сделать, выполните преобразование до , выполнив расчеты. К счастью, вы можете сделать это непосредственно в литеральном значении (во время компиляции) без необходимости запускать (во время выполнения). Добавление M к любому одному значению в выражении должно делать трюк:

(1088M / 22000) * 100

, или вы можете явно отмечать их как десятичные числа:

(1088M / 22000M) * 100M

С помощью этого вы можете удалить приведение, так как результат десятичного выражения сам будет десятичным:

OverTimeHoursPercentage = (1088M / 22000M) * 100M
musefan ответил: 28 апреля 2018 в 09:32

Разделение 2 целых чисел приведет к целочисленному результату, который потеряет любую из десятичной точности, которую вы ищете.

Поэтому вам нужно сделать хотя бы одно из значений в разделе десятичное число. Кастинг после расчет слишком поздний, повреждение уже сделано.

Попробуйте следующее:

OverTimeHoursPercentage = (((decimal)1088 / 22000)*100)

или еще лучше, если это буквальное значение, затем объявите его как десятичное и не бросайте (обратите внимание на m):

OverTimeHoursPercentage = ((1088m / 22000)*100)