web-dev-qa-db-fra.com

Comment utiliser le module pour float / double?

Je crée une calculatrice RPN pour un projet scolaire. J'ai des problèmes avec l'opérateur de module. Puisque nous utilisons le type de données double, le module ne fonctionnera pas sur les nombres à virgule flottante. Par exemple, 0,5% 0,3 devrait renvoyer 0,2 mais je reçois une division par exception de zéro.

L'instruction dit d'utiliser fmod (). J'ai cherché partout fmod (), y compris javadocs mais je ne le trouve pas. Je commence à penser que c'est une méthode que je vais devoir créer?

edit: hmm, étrange. Je viens de rebrancher ces chiffres et cela semble bien fonctionner ... mais juste au cas où. Dois-je faire attention à l'utilisation de l'opérateur mod dans Java lors de l'utilisation de types flottants? Je sais que quelque chose comme ça ne peut pas être fait en C++ (je pense).

44
ShrimpCrackers

Vous avez probablement eu une faute de frappe lors de sa première exécution.

évaluer 0.5 % 0.3 renvoie '0,2' (un double) comme prévu.

Mindprod a un bon aperçu du fonctionnement du module en Java.

64
RodeoClown

Contrairement à C, Java permet d'utiliser le% pour les nombres entiers et à virgule flottante et (contrairement à C89 et C++), il est bien défini pour toutes les entrées (y compris les négatifs):

De JLS §15.17.3 :

Le résultat d'une opération de virgule flottante est déterminé par les règles de l'arithmétique IEEE:

  • Si l'un des opérandes est NaN, le résultat est NaN.
  • Si le résultat n'est pas NaN, le signe du résultat est égal au signe du dividende.
  • Si le dividende est un infini, ou le diviseur est un zéro, ou les deux, le résultat est NaN.
  • Si le dividende est fini et que le diviseur est un infini, le résultat est égal au dividende.
  • Si le dividende est nul et que le diviseur est fini, le résultat est égal au dividende.
  • Dans les cas restants, où ni un infini, ni un zéro, ni NaN ne sont impliqués, le reste à virgule flottante r de la division d'un dividende n par un diviseur d est défini par la relation mathématique r = n- (d · q ) où q est un entier négatif uniquement si n/d est négatif et positif uniquement si n/d est positif, et dont la magnitude est aussi grande que possible sans dépasser la magnitude du vrai quotient mathématique de n et d.

Donc pour votre exemple, 0,5/0,3 = 1,6 .... q a le même signe (positif) que 0,5 (le dividende), et la magnitude est 1 (entier avec la plus grande magnitude ne dépassant pas la magnitude de 1,6 ...), et r = 0,5 - (0,3 * 1) = 0,2

41
Matthew Flaschen

Je pensais que l'opérateur de module normal fonctionnerait pour cela en Java, mais il ne peut pas être difficile de coder. Il suffit de diviser le numérateur par le dénominateur et de prendre la partie entière du résultat. Multipliez cela par le dénominateur et soustrayez le résultat du numérateur.

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

fmod est la fonction C standard pour la gestion du module à virgule flottante; J'imagine que votre source disait que Java gère le module à virgule flottante de la même manière que la fonction fmod de C. Dans Java vous pouvez utiliser le % L'opérateur sur double le même que sur les entiers:

int x = 5 % 3; // x = 2
double y = .5 % .3; // y = .2
3
Michael Mrozek