Лучший способ заставить Java-модуль вести себя так, как должен, с отрицательными числами?

В java, когда вы делаете

a % b 

Если a отрицательный, он вернет отрицательный результат, вместо того, чтобы обертывать его так, как нужно. Каков наилучший способ исправить это? Только так я могу думать

 a < 0 ? b + a : a % b 

    5 Solutions collect form web for “Лучший способ заставить Java-модуль вести себя так, как должен, с отрицательными числами?”

    Он ведет себя так, как должен a% b = a – a / b * b; т.е. это остаток.

    Вы можете сделать (a% b + b)% b


    Это выражение работает как результат (a % b) обязательно ниже b , независимо от того, a ли a положительным или отрицательным. Добавление b заботится об отрицательных значениях a , так как (a % b) является отрицательным значением между -b и 0 , (a % b + b) обязательно ниже b и положительным. Последний modulo существует, если a положителен для начала, так как если a положительно (a % b + b) , станет больше b . Следовательно, (a % b + b) % b b снова превращает его в меньший, чем b (и не влияет на отрицательные значения a ).

    Начиная с Java 8, вы можете использовать Math.floorMod (int x, int y) и Math.floorMod (long x, long y) . Оба эти метода возвращают те же результаты, что и ответ Питера.

     Math.floorMod( 2, 3) = 2 Math.floorMod(-2, 3) = 1 Math.floorMod( 2, -3) = -1 Math.floorMod(-2, -3) = -2 

    Для тех, кто не использует (или не может использовать) Java 8, Guava пришла на помощь с IntMath.mod () , доступным с Guava 11.0.

     IntMath.mod( 2, 3) = 2 IntMath.mod(-2, 3) = 1 

    Одно предостережение: в отличие от Math.floorMod () Java 8, делитель (второй параметр) не может быть отрицательным.

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

    = MOD (-4,180) = 176 = MOD (176, 180) = 176

    потому что 180 * (-1) + 176 = -4 такое же, как 180 * 0 + 176 = 176

    Используя пример часов здесь, http://mathworld.wolfram.com/Congruence.html, вы бы не сказали, что duration_of_time mod cycle_length составляет -45 минут, вы сказали бы 15 минут, хотя оба ответа удовлетворяют базовому уравнению.

    Вот альтернатива:

     a < 0 ? b-1 - (-a-1) % b : a % b 

    Это может быть или не быть быстрее, чем другая формула [(a% b + b)% b], подумать об этом. Он содержит ветвь, которая обычно плохо работает с современными процессорами, но использует одну менее модульную операцию.

    На самом деле это определенно может быть медленнее.

    (Изменить: Исправлена ​​формула.)

    Interesting Posts

    Была предпринята попытка доступа к сокету, запрещенному его разрешениями доступа

    Исключение Json и Circular Reference Exception

    Совокупность данных в данном столбце и отображение другого столбца

    Решение «сбоя связи» с JDBC и MySQL

    Как перенаправить определенный трафик через OpenVPN?

    Функция Excel, которая оценивает строку, как формулу?

    Windows 7 продолжает переименовывать мой диск в другую букву, когда мой внешний жесткий диск подключен

    Сохранить NSDictionary для plist

    Могу ли я заставить Thunderbird загружать разные учетные записи электронной почты один за другим, а не все одновременно?

    Совместное использование файлов и принтеров не останется включенным после включения

    make_unique и совершенная переадресация

    Подавление выхода

    API Карт Google: заголовок «Access-Control-Allow-Origin» отсутствует на запрошенном ресурсе

    Как показать конкретный скрытый файл в диалоговом окне браузера файлов – Mac OS X

    Пакетное преобразование документов Word в PDF-файлы

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