Как я использую модуль для плавающего/двойного?

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

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

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

45
задан Dylan Valade 13 April 2016 в 21:01
поделиться

4 ответа

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

оценка 0,5% 0,3 возвращает «0,2» (двойное значение), как и ожидалось.

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

64
ответ дан 26 November 2019 в 21:00
поделиться

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

int x = 5 % 3; // x = 2
double y = .5 % .3; // y = .2
3
ответ дан 26 November 2019 в 21:00
поделиться

В отличие от 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

.
43
ответ дан 26 November 2019 в 21:00
поделиться

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

x = n / d
xint = Integer portion of x
result = n - d * xint
6
ответ дан 26 November 2019 в 21:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: