Является ли «long x = 1/2» равным 1 или 0 и почему?

если у меня есть что-то вроде:

long x = 1/2; 

не следует ли округлить до 1? Когда я печатаю его на экране, он говорит 0.

    Он выполняет целочисленное деление, которое усекает все справа от десятичной точки.

    Целочисленное деление имеет свои корни в теории чисел. Когда вы делаете 1/2, вы спрашиваете, сколько раз 2 равно 1? Ответ никогда не будет, поэтому уравнение становится равным 0 * 2 + 1 = 1, где 0 – коэффициент (что вы получаете от 1/2), а 1 – остаток (что вы получаете от 1% 2).

    Правильно отметить, что% не является истинным модулем в математическом смысле, а всегда остается от деления. Существует разница, когда вы имеете дело с отрицательными целыми числами.

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

    Что это выражение делает, он сначала объявляет о существовании длинного имени x, а затем присваивает ему значение выражения правой стороны. Выражение правой стороны равно 1/2, и поскольку 1 и 2 являются целыми числами, это интерпретируется как целочисленное деление. При целочисленном делении результат всегда является целым числом, поэтому что-то по строкам 5/3 вернет 1, так как только одна тройка помещается в пять. Итак, с 1/2, сколько 2s может вписаться в 1? 0.

    Это может на некоторых языках приводить к некоторым интересным выводам, если вы пишете что-то вроде double x = 1/2. В этом случае вы можете ожидать 0,5, но сначала он будет оценивать целочисленное значение справа, прежде чем назначать и преобразовывать результат в double, давая значение 0.0

    Важно отметить, что при выполнении такого рода преобразования типов он никогда не будет округлять результат. Итак, если вы делаете противоположное: long x = (long) (1.0 / 2.0); тогда, когда (1.0 / 2.0) будет оцениваться до 0,5, (длинный) приведение заставит это быть усеченным до 0. Даже если бы у меня был длинный x = (long) (0,9), результат все равно равен 0. Он просто обрезает после десятичной точки.

    Он не может округлить, потому что он никогда не может быть округлен

    Выражение «1/2» никогда не будет равным 0,5, прежде чем назначать длинные

    Теперь, long x = 1.0/2.0 потому что выражение справа перед назначением действительно для округления. Если вы не получите 0.499999999999997 …

    на этот вопрос был дан ответ до этого на этом сайте, вы делаете целочисленное деление, если хотите получить 0.5:

     double x = (double)1/2; 

    и вы получите значение 0.5 .

    Существует множество различных конвенций округления, наиболее распространенных – округление к + inf, округление к -inf и округление до нуля. Многие люди предполагают, что есть один правильный путь, но у всех есть разные представления о том, каким должен быть этот способ 😉

    Не существует промежуточного нецелого результата для целочисленного деления, но, конечно, деление детерминировано, и для конкретной платформы и компилятора всегда будет выполняться одно конкретное соглашение о округлении.

    С Visual C ++ я получаю 5/2 = 2 и -5/2 = -2, округляя до нуля.

    Округление на C, C ++ и Java обычно называется «усечением» – это означает удаление нежелательных бит. Но это может ввести в заблуждение. Использование битового двоичного кода 4 бит 2s, делая то, что подразумевает усечение, дает …

      5/2 = 0101/0010 = 0010.1 --> 0010 = 2 -5/2 = 1011/0010 = 1101.1 --> 1101 = -3 

    Который округляется к -infinity, что и делает Python (или, по крайней мере, то, что он сделал в Python 2.5).

    Усечение было бы правильным словом, если бы мы использовали представление знаковой величины, но двойное дополнение было де-факто стандартом на протяжении десятилетий.

    В C и C ++ я ожидаю, что, в то время как это обычно называется усечением, на самом деле эта деталь не определена в стандартах и ​​оставлена ​​для реализации – предлог для того, чтобы позволить компилятору использовать самый простой и быстрый метод для платформы (что означает инструкция разделения процессоров естественно делает). Это только проблема, если у вас есть отрицательные числа, хотя – я еще не видел ни одного языка или реализации, которые бы дали 5/2 = 3.

    Я не знаю, что говорит стандарт Java. В руководстве Python указано разделение «пол», которое является общим термином для округления до -infinity.

    РЕДАКТИРОВАТЬ

    Дополнительная заметка – по определению, если a / b = c остаток d, то a = (b * c) + d. Чтобы это удержать, вам нужно выбрать остаток, чтобы скомпоновать свое соглашение о округлении.

    Люди склонны считать, что остатки и модулю одинаковы, но WRT подписывает значения, они могут быть разными – в зависимости от правил округления. Значения по модулю по определению никогда не отрицательны, но остатки могут быть отрицательными.

    Я подозреваю, что правило Python round-to-negative-infinity предназначено для того, чтобы гарантировать, что единственный оператор% действителен как в качестве остатка, так и по модулю. В C и C ++ то, что означает% (остаток или по модулю), является (да, вы догадались) реализацией.

    У Ada фактически есть два отдельных оператора – mod и rem. С делением требуется округлять до нуля, так что мода и рема дают разные результаты.

    Давайте будем гением компьютера.