Почему операторы деления (/) ведут себя по-разному в VB.NET и С#?

Если вы создаете новые проекты на С# и VB.NET, перейдите прямо в окно Immediate и введите следующее:

? 567 / 1000

С# вернет 0, а VB.NET вернет 0.567.

Чтобы получить тот же результат в С#, вам нужно ввести

? 567 / 1000.0

Почему это различие? Почему С# требует явной десятичной точки после 1000?

Ответ 1

/operator в С# для целочисленных операндов выполняет операцию "целочисленное деление" (эквивалентно \operator в VB.NET). Для VB.NET это "нормальное" деление (даст дробный результат). В С#, чтобы сделать это, вы должны явно указать хотя бы один операнд в тип с плавающей точкой (например, double).

Ответ 2

Поскольку в VB.NET оператор / определен для возврата результата с плавающей запятой. Он расширяет свои входы до double и выполняет разделение. В С# оператор / выполняет целочисленное деление, когда оба входа являются целыми числами.

См. MSDN для VB.NET.

Разделяет два числа и возвращает результат с плавающей запятой.

Прежде чем выполнить деление, любые целочисленные числовые выражения будут расширены до Double.

См. MSDN для С#.

Оператор деления (/) делит свой первый операнд на второй. Все числовые типы имеют предопределенные операторы деления.

Когда вы делите два целых числа, результат всегда является целым числом.

Чтобы получить ту же семантику в VB.NET, что и оператор / для целых чисел в С#, используйте оператор \.

Разделяет два числа и возвращает целочисленный результат.

Ответ 3

По умолчанию С# обрабатывает 576/1000 как целочисленное деление, поэтому вы получаете целое число в качестве результата.

В VB.NET он рассматривает это как деление с плавающей запятой.

Добавив ".0" в число в С#, вы явно указываете, что это число является числом с плавающей запятой, и, следовательно, деление становится также плавающей точкой.

Ответ 4

Языки разные. В С# компилятор интерпретирует эти числа как целые числа и использует целочисленное деление. В VB.NET компилятор использует деление с плавающей запятой.