C # сам округляет деления в меньшую сторону

Когда я делаю разделение на C #, оно автоматически округляется в меньшую сторону. См. Этот пример:

double i;
i = 200 / 3;
Messagebox.Show(i.ToString());

Это показывает мне окно сообщения, содержащее "66". 200/3 на самом деле 66,66666 ~, однако.

Есть ли способ избежать округления в меньшую сторону и сохранить число вроде 66.6666667?


person ONOZ    schedule 10.06.2011    source источник
comment
Важный урок здесь не только в том, что целочисленная арифметика выполняется с целыми числами. Скорее дело в том, что типы операндов более важны для анализа программы, чем тип, которому присваивается результат. В C # мы почти всегда рассуждаем изнутри наружу; мы не говорим о, я вижу, вы назначаете это двойнику, поэтому я сделаю арифметику с плавающей запятой. Вместо этого мы говорим, что я вижу, что вы делите два целых числа; вы должны получить результат в виде целого числа. О, вы хотите, чтобы это целое число было двойным? затем преобразуем его в двойное.   -  person Eric Lippert    schedule 11.06.2011
comment
Я сейчас тоже занимаюсь этой проблемой. Из приведенного ниже я вижу причины того, почему деление двух целых чисел приводит к целому числу, и я доволен этим. Однако я не могу понять следующее: почему C # / VB.Net округляет 200/3 до 66? Мы знаем, что если мы выполним следующие 200 / 3.0, мы получим 66.6666667. Так почему же это число округляется до 66, а не до 67? Если я сделаю следующее, у меня будет 67: Convert.ToInt32 (200 / 3.0) Итак, мое десятичное число в int станет 67, а среда выполнения преобразует мое число в 66?   -  person Oxonhammer    schedule 02.02.2017
comment
Очень похоже (хотя тот спрашивает причину, а не как ее исправить)   -  person user202729    schedule 25.06.2018


Ответы (10)


i = 200 / 3 выполняет целочисленное деление.

Попробуйте либо:

i = (double)200 / 3

or

i = 200.0 / 3

or

i = 200d / 3

Объявление одной из констант как двойной приведет к использованию оператора двойного деления.

person rsbarro    schedule 10.06.2011

200/3 - целочисленное деление, в результате получается целое число.

попробуйте 200.0 / 3.0

person John Boker    schedule 10.06.2011
comment
Или 200 / 3,0. Или 200.0 / 3. Или (двойной) 200 / 3. или 200 / (двойной) 3. Или как хотите. - person JAB; 11.06.2011
comment
@JAB некогда думать, просто надо было добраться первым :) - person John Boker; 11.06.2011
comment
Я полагаю, он новенький, правила - первый пост с правильным ответом побеждает ... верно? - person John Boker; 11.06.2011

200 / 3 это целочисленное деление. Измените на: 200.0 / 3, чтобы сделать его делением с плавающей запятой.

person Yakov Galka    schedule 10.06.2011

Вы можете указать строку формата с желаемым количеством десятичных понитов:

double i;
i = 200 / 3.0;
Messagebox.Show(i.ToString("F6"));
person Petar Ivanov    schedule 10.06.2011

Хотя на самом деле ответ 66,666, происходит то, что вычисляется 200/3, что дает целое число. Затем целое число помещается в число с плавающей запятой. Сама математика происходит как целочисленная. Чтобы сделать это число с плавающей запятой, используйте 200.0 / 3. Значение .0 заставит его рассматривать 200 как число с плавающей запятой, что приведет к математике с плавающей запятой.

person JoshuaRogers    schedule 10.06.2011

Помимо double vs int, происходящего в этом действии, вы думаете о double как о точной единице. Если вам действительно важна точность, попробуйте использовать десятичный тип данных.

Дополнительная информация в этом ответе: десятичное или двойное! - Какой из них использовать и когда?

person sclarson    schedule 10.06.2011

двойной i = 200,0 / 3;

двойной i = ((двойной) 200) / 3;

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

person Chad    schedule 10.06.2011

Попробуй это

i = 200d/3d;

и он не будет круглым.

person Bala R    schedule 10.06.2011

200 и 3 являются целыми числами, поэтому результат будет целым. Преобразуйте одно из них в десятичное.

person Mike M.    schedule 10.06.2011

Все данные ответы неверны, потому что они переводят целочисленное деление в единственное в своем роде двойное, что явно не то, о чем просили (по крайней мере, с точки зрения производительности). Очевидный ответ - математика в начальной школе: умножить на 10, прибавить 5 и снова разделить, все целое число.

i = (2000 / 3 + 5 ) / 10

Здесь вы ловите второе деление, что лучше, чем двойное преобразование, но все же далеко от совершенства. Вы можете пойти еще дальше и умножить на другой коэффициент и добавить другие значения, кроме пяти, что позволит вам использовать сдвиг вправо вместо деления на 10. Точная формула для этого оставлена ​​в качестве упражнения для читателя. (Просто погуглите "деления с умножением сдвига")

Хорошего дня.

person Tekahe    schedule 28.10.2014
comment
Нет. Из примера кода OP ясно, что ему нужен результат double без усечения до int. - person Mike Cowan; 28.10.2014