Почему отрицательные числа округляются после деления в Ruby?

я просматриваю документацию по divmod. Часть таблицы, показывающая разницу между методами div, divmod, modulo и remainder показано ниже:

enter image description here

почему 13.div(-4) округляется до -4, а не -3? Есть ли какое-либо правило или соглашение в Ruby, чтобы округлить отрицательные числа? Если да,то почему следующий код не округляется?

-3.25.round()  #3

1 ответов


13.div(-4) == -4 и 13.modulo(-4) == -3, Так что

(-4 * -4) + -3 == 13

и вы получаете последовательные отношения

(b * (a/b)) + a.modulo(b) == a

почему 13.div (-4) округлен до -4, а не до -3?

это заблуждение. 13.div(-4) на самом деле не округляется на всех. Это целочисленное деление и следует самосогласованным правилам работы с целыми числами и модульной арифметикой. Логика округления, описанная в ваша ссылка подходит с он, а затем применяется последовательно при работе с тем же divmod операция, когда один или оба параметра Floats. Математические операции с отрицательными или дробными числами часто расширяются из более простых, более интуитивных результатов на положительных целых числах таким образом. Е. Г. это следует той же логике, как дробные и отрицательные степени, или нецелое факториалы создаются из положительного числа вариантов.

в этом случае речь идет о самосогласованности из divmod, но не о округлении в целом.

у дизайнеров Ruby был выбор, чтобы сделать при работе с отрицательными числами, не все языки дадут тот же результат. Однако, как только было решено, что Ruby вернет знак результата по модулю, соответствующий делителю (в отличие от соответствия делению в целом), это установит, как работают остальные числа.

есть ли какое-либо правило или соглашение в Ruby, чтобы округлить отрицательные числа?

да. Округление числа float означает возврат численно ближайшего целого числа. Когда есть два одинаково близких целых числа, Ruby округляет до целого числа, наиболее удаленного от 0. Это полностью отдельное проектное решение от того, как работают целочисленные методы деления и арифметические методы по модулю.

если да,то почему следующий код не округляется? -3.25.round() #3

Я предполагаю, что вы имеете в виду результат читать -3. Метод round не "округлять." Это "ближайший круг". -3 - это ближайшее целое число к -3.25. Дизайнеры Ruby должны были сделать выбор, хотя, что делать с -3.5.round() # -4. Некоторые языки вместо этого возвращают -3 при округлении этого числа.