Подразделение в VB.NET

В чем разница между / и \ для деления в VB.NET?

Мой код дает очень разные ответы в зависимости от того, что я использую. Я видел оба раньше, но я никогда не знал разницы.


person Cyclone    schedule 03.12.2010    source источник


Ответы (3)


Есть два способа деления чисел. Быстрый путь и медленный путь. Многие компиляторы пытаются заставить вас сделать это быстрее. С# — один из них, попробуйте следующее:

using System;

class Program {
    static void Main(string[] args) {
        Console.WriteLine(1 / 2);
        Console.ReadLine();
    }
}

Выход: 0

Вы довольны таким исходом? Это технически правильное, задокументированное поведение, когда левая и правая части выражения являются целыми числами. Это делает быстрое целочисленное деление. Инструкция IDIV на процессоре вместо (печально известной) инструкции FDIV. Также полностью соответствует тому, как работают все языки с фигурными скобками. Но определенно основной источник вопросов «что случилось» в SO. Чтобы получить счастливый результат, вам нужно сделать что-то вроде этого:

    Console.WriteLine(1.0 / 2);

Выход: 0,5

Левая сторона теперь двойная, что приводит к делению с плавающей запятой. С тем результатом, который показывает ваш калькулятор. Другие способы вызвать FDIV — сделать правую часть числом с плавающей запятой или явным приведением одного из операндов к (double).

VB.NET так не работает, оператор / всегда является делением с плавающей запятой, независимо от типов. Иногда вам действительно действительно нужно целочисленное деление. Это то, что делает \.

person Hans Passant    schedule 03.12.2010
comment
Интересный момент вы затронули. Я всегда понимал разницу между / и \ в VB, но по какой-то причине мне никогда не приходило в голову, что это выполняет ту же работу, что и указание типов данных в языках C. Думаю, теперь я могу вернуться и удалить все буквы D и F в конце моих номеров. знак равно - person AndyPerfect; 03.12.2010

10 / 3 = 3.33333333333333, assigned to integer = 3
10 \ 3 = 3, assigned to integer = 3
20 / 3 = 6.66666666666667, assigned to integer = 7
20 \ 3 = 6, assigned to integer = 6

Код для вышеперечисленного:

Dim a, b, c, d As Integer
a = 10 / 3
b = 10 \ 3
c = 20 / 3
d = 20 \ 3

Debug.WriteLine("10 / 3 = " & 10 / 3 & ", assigned to integer = " & a)
Debug.WriteLine("10 \ 3 = " & 10 \ 3 & ", assigned to integer = " & b)
Debug.WriteLine("20 / 3 = " & 20 / 3 & ", assigned to integer = " & c)
Debug.WriteLine("20 \ 3 = " & 20 \ 3 & ", assigned to integer = " & d)
person adrianwadey    schedule 06.10.2017

person    schedule
comment
Некоторая разработка может быть в порядке. - person Peter Mortensen; 08.09.2016
comment
@PeterMortensen На самом деле, нет, это совершенно краткое изложение, которое рассказало мне именно то, что я хотел знать. Хотя в первой строке можно было указать деление с плавающей запятой. - person Nyerguds; 30.09.2020