Деление в C # идет не так, как я ожидаю - PullRequest
4 голосов
/ 08 марта 2010

Я пытаюсь что-то написать, чтобы мои изображения показывались правильно. У меня есть 2 номера "breedtePlaatje" и "hoogtePlaatje". Когда я загружаю эти 2 переменные со значениями, я получаю "800" и "500", я ожидаю, что "verH" будет (500/800) = 0,625. То есть значение verH = 0 ..

Это код:

int breedtePlaatje = Convert.ToInt32(imagefield.Width);
int hoogtePlaatje = Convert.ToInt32(imagefield.Height);

//Uitgaan van breedte plaatje
if (breedtePlaatje > hoogtePlaatje)
{
    double verH = (hoogtePlaatje/breedtePlaatje);
    int vHeight = Convert.ToInt32(verH * 239);

    mOptsMedium.Height = vHeight;
    mOptsMedium.Width = 239;

    //Hij wordt te klein en je krijgt randen te zien, dus plaatje zelf instellen
    if (hoogtePlaatje < 179)
    {
        mOptsMedium.Height = 179;
        mOptsMedium.Width = 239;
    }
}

Любые советы, касающиеся моего подхода, были бы прекрасны.

Ответы [ 5 ]

11 голосов
/ 08 марта 2010

Деление int на int дает int.

double verH = (hoogtePlaatje/breedtePlaatje);

Правая часть присваивания является целочисленным значением.

Измените breedtePlaatje и / или hoogtePlaatje на удвоение, и вы получите ожидаемый ответ.

6 голосов
/ 08 марта 2010

Целочисленное деление приведет к тому, что целое число будет возвращено как результат деления.

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

double verH = (double)hoogtePlaatje/breedtePlaatje;

Или

double verH = hoogtePlaatje/(double)breedtePlaatje;

См. спецификацию C # относительно деления.

4 голосов
/ 08 марта 2010

Когда вы делите два целых числа, C # использует целочисленное деление , где дробная часть отбрасывается. В вашем случае вы получаете:

500 / 800 = 0 + 5/8 

Что, отбрасывая дробную часть, дает:

500 / 800 = 0

Чтобы получить деление с плавающей запятой, приведите один из аргументов к double, float или decimal в зависимости от требуемого уровня точности, что приведет к неявному преобразованию другого аргумента в тот же тип и деление выполняется с использованием правил с плавающей запятой вместо целочисленных правил, например

double result = (double)breedtePlaatje  / hoogtePlaatje ;
2 голосов
/ 08 марта 2010

Я никогда не использовал C #, но, вероятно, вам нужно будет привести одну из переменных к удвоению, например:

double verH = (double)hoogtePlaatje/breedtePlaatje;
1 голос
/ 08 марта 2010

Попробуйте это:

double verH = double (hoogtePlaatje) / breedtePlaateje;

Если вы разделите int на int, вы получите усеченный ответ. Примените одного из них к двойному, и все деление будет сделано двойным.

...