Этот вопрос закрыт для ответов, так как повторяет вопрос Оператор // в Python?
@vohman

Как работают операции // и % в Python для отрицательных чисел?

Я ожидал само-собой разумеющегося результата для выражений 10//3 и 10%3 : получил 3 и 1 соответственно.
Но когда сделал то же самое для отрицательного 10, получил неожиданно "странный" результат:
- 10//3 == - 4
- 10%3 == 2
Попробовав divmod(10, 3) и divmod(-10, 3) получил тот же результат, что естественно.
Выходит, что результат работы операторов целочисленного деления и деления по модулю в Python для отрицательных чисел подчиняется совершенно не классическим математическим законам, а рассчитывается по какой-то своей зависимости-функции.
Действительно, в математике 10//3 и -10//3 будет отличаться лишь знаком (3 и -3).
help(divmod) объясняет, что результат divmod(x, y) подчиняется такому закону div*y + mod == x.
Хотелось бы понять, как в Python можно быстро понять (посчитать в "уме") результат операции x//y и x%y при отрицательных значениях (для положительных считается легко и привычно)?
И чем обоснована такая зависимость в Python для этих операций, а не "классическая" математическая?
  • Вопрос задан
  • 5982 просмотра
Ответы на вопрос 2
@AVKor
И чем обоснована такая зависимость в Python для этих операций, а не "классическая" математическая?

Всё полностью соответствует тому, как в математике. Просто вы её не знаете.
Ответ написан
@vohman Автор вопроса
Я, конечно же, не дипломированный математик :)) как мне написали, но школьную математику я еще осилю ))
По поводу округления и в какую сторону - этого нет в понятии целочисленного деления в математике, да и вроде как в Питоне для не отрицательных чисел такое округление не делается.
К тому же -10/3 = -3.33333333.... и округление (раз мне предлагают им воспользоваться) будет в сторону -3 - это в математике. И так поступают в основном в других языках.

Выходит, что в математике :
(-10) "целочисленно разделить на" (3) равен (-4) ?
Я всегда думал, что -10 div 3 равно в математике -3.
---------
Допустим, я не знаю математику..
Тогда на Си результат -10 div 3 будет -3 -1 ( Результат нижеприведенного кода: Quotient and remainder: -3 -1 )
#include stdio.h
#include stdlib.h
int main(void)
{
div_t n;
n = div(-10,3);
printf("Quotient and remainder: %d %d\n", n.quot, n.rem);
return 0;
}

На старом Pascal результатом -10 целочисленно разделить на 3 будет так же (-3)
var result : integer;
begin
result := -10 div 3;
writeln('Result = ', result);
end.

Почему же на Python результат ( -4 ) ? - нет, понятно, что считается он соответственно своего какого-то закона. Но как это быстро в голове посчитать согласно той формуле, что указана была мной выше?
И на каком основании это деление считается в Питоне вот так а не "как обычно"?
Ответ написан
Ваш ответ на вопрос

Вопрос закрыт для ответов и комментариев

Потому что уже есть похожий вопрос.
Похожие вопросы