C # десятичные разряды с целочисленными операторами - PullRequest
0 голосов
/ 20 мая 2010

Итак, у меня есть этот код:

p.Value = 1;
decimal avg = p.Value * 100 / 10000;
string prntout = p.Key + " : " + avg.ToString();
Console.WriteLine(prntout);

Но программа выводит 0 вместо 0,01.p.Value является int.Как мне это исправить?

Ответы [ 4 ]

3 голосов
/ 20 мая 2010

Измените один из литералов на десятичный:

decimal avg = p.Value * 100m / 10000;

Теперь, чтобы объяснить, почему это работает:

Позволяет обрабатывать исходную строку по одной операции за раз, подставляя 1 вместо p. Значение:

decimal avg = 1 * 100 / 10000; // int multiplication
decimal avg = 100 / 10000; // int division, remainder tossed out
decimal avg = (decimal) 0; // implicit cast

Теперь изменив значение 100 на 100 м:

decimal avg = 1 * 100m / 10000; // decimal multiplication
decimal avg = 100m / 10000; // decimal division
decimal avg = 0.01m;
1 голос
/ 20 мая 2010

Попробуйте изменить это:

decimal avg = p.Value * 100 / 10000;

до

decimal avg = Convert.ToDecimal(p.Value) * 100.0 / 10000.0;

В ваших предыдущих версиях использовались все целые числа.

1 голос
/ 20 мая 2010

Выражение p.Value * 100 / 10000 использует только целочисленные типы, поэтому вычисляется в соответствии с целочисленным делением правил.

Измените один (или более) параметров на десятичный, и он будет работать, как и ожидалось:

p.Value * 100 / 10000m
0 голосов
/ 20 мая 2010

Если P.Value является целым числом, вы, вероятно, потеряете дробь в этой строке:

десятичное значение avg = p.Value * 100/10000;

Так что вы можете сделать это:

десятичное значение avg = (десятичное число) P.Value * 100/10000;

Надеюсь, это поможет.

...