Как использовать модуль для float / double?

Я создаю калькулятор RPN для школьного проекта. У меня проблемы с оператором модуля. Поскольку мы используем тип данных double, модуль не будет работать с числами с плавающей запятой. Например, 0.5 % 0.3 0.2 должен вернуться, но я получаю деление на ноль исключение.

в инструкции говорится использовать fmod (). Я везде искал fmod (), включая javadocs, но я не могу его найти. Я начинаю думать, что это способ я собираюсь создать?

edit: Хм, странно. Я просто снова подключил эти цифры, и, похоже, он работает нормально...но на всякий случай. Нужно ли мне следить за использованием оператора mod в Java при использовании плавающих типов? Я знаю, что что-то подобное нельзя сделать на C++ (я думаю).

4 ответов


у вас, вероятно, была опечатка, когда вы впервые запустили его.

оценка 0.5 % 0.3 возвращает значение '0.2' (двойной), как и ожидалось.

Mindprod есть хороший обзор того, как модуль работает в Java.


В отличие от C, Java позволяет использовать % для целых чисел и с плавающей запятой и (в отличие от C89 и C++) он хорошо определен для всех входных данных (включая негативы):

с JLS §15.17.3:

результат с плавающей точкой остаток операции определяется правила арифметики IEEE:

  • если любой из операндов является NaN, результатом является NaN.
  • если результат не NaN, то знак результата равен знак дивиденд.
  • если дивиденд является Бесконечностью, или делитель равен нулю, или оба, то результат-NaN.
  • если дивиденд конечен, а делитель бесконечен, результат равняется дивиденду.
  • если дивиденд равен нулю, а делитель конечен, результат равняется дивиденду.
  • в остальных случаях, когда ни бесконечность, ни ноль, ни НАН вовлечена, плавающая точка остаток R от деление дивиденд n делителем d определяется по математическому соотношению r=n-(d·q) где q-отрицательное целое число только если n/d отрицательно и положительно только если N / d положительно, и чей величина как можно больше без превышения величины истинный математический коэффициент n и d.

Итак, для вашего примера, 0.5 / 0.3 = 1.6... . q имеет тот же знак (положительный), что и 0.5 (дивиденд), а величина равна 1 (целое число с наибольшей амплитудой, не превышающей величины 1.6...), и r = 0.5 - (0.3 * 1) = 0.2


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

x = n / d
xint = Integer portion of x
result = n - d * xint

fmod является стандартной функцией C для обработки модуля с плавающей запятой; я полагаю, ваш источник говорил, что Java обрабатывает модуль с плавающей запятой так же, как c