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