Я создаю калькулятор RPN для школьного проекта. Я испытываю затруднения из-за оператора модуля. Так как мы используем двойной тип данных, модуль не будет работать над числами с плавающей точкой. Например, 0,5% 0.3 должны возвратиться 0.2, но я получаю исключение деления на нуль.
В инструкции говорится для использования fmod (). Я везде искал fmod (), включая javadocs, но я не могу найти его. Я начинаю думать, что это - метод, который я оказываюсь перед необходимостью создавать?
править: хм, странный. Я просто включил те числа снова, и это, кажется, хорошо работает..., но на всякий случай. Я должен предостеречься использование оператора Mod в Java при использовании типов с плавающей точкой? Я знаю, что что-то вроде этого не может быть сделано в C++ (я думаю).
Вероятно, вы допустили опечатку при первом запуске.
оценка 0,5% 0,3
возвращает «0,2» (двойное значение), как и ожидалось.
Mindprod предлагает хороший обзор того, как модуль работает в Java.
fmod
- стандартная функция C для обработки модуля с плавающей запятой; Я полагаю, ваш источник говорил, что Java обрабатывает модуль с плавающей запятой так же, как функция C fmod
. В Java вы можете использовать оператор %
для чисел двойной точности так же, как и для целых чисел:
int x = 5 % 3; // x = 2
double y = .5 % .3; // y = .2
В отличие от C, Java позволяет использовать % как для целых чисел, так и для чисел с плавающей точкой, и (в отличие от C89 и C++) он хорошо определен для всех входов (включая отрицательные):
Из JLS §15.17.3:
Результат операции с плавающей точкой результат операции с остатком определяется правилами арифметики IEEE:
- Если один из операндов равен NaN, то результат равен NaN.
- Если результат не является NaN, знак результата равен знаку дивиденда.
- Если дивиденд - бесконечность, делитель - ноль или и то, и другое, результатом будет NaN. результатом будет NaN.
- Если дивиденд конечен, а делитель - бесконечность, то результат равен дивиденду.
- Если дивиденд равен нулю, а делитель конечен, результат равен дивиденду.
- В остальных случаях, когда ни бесконечность, ни ноль, ни NaN, результат с плавающей запятой остаток r от деления дивиденда n на делитель d определяется математическим соотношением r=n-(d-q) где q - целое число, которое является отрицательным только если 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