2017-10-10 1 views
2

Je voudrais savoir si un nombre réel est une multitude de l'autre. J'utilise BC-Math parce que le code fait partie d'un système plus grand faisant des calculs de prix et l'utilisation de flottants donne de mauvais résultats sur plusieurs calculs en raison du comportement des calculs en virgule flottante.Obtenir le modulo de deux nombres réels avec BCMath

BC-Math a bcmod() pour obtenir le module d'un nombre de précision arbitraire. Cependant, avant PHP 7.2, cette fonction ne fonctionne pas avec les chaînes numériques non entières. Par exemple:

echo bcmod('10', '9.2'); // 1, because '9.2' is truncated to '9' 

Conversion des dossards à flotteurs et à l'aide fmod() est pas une option depuis fmod function returning wrong result

Je ne pouvais trouver aucune solution à ce problème, mais je ne peux pas l'image qu'il n'y a pas de solution .

EDIT:

lecteur Bonjour à l'avenir qui rencontre le même problème! Basé sur la réponse de @ chiliNUT j'ai créé un pull-request pour la bibliothèque bcmath-extended.

Répondre

2

Je pense que cela peut être fait en utilisant un peu de maths:

Vous pouvez rapporter mod(a,b)-a et b avec cette équation:

a = b * floor(a/b) + mod(a,b) 

(explanation)

puis résoudre cette équation pour mod pour produire

mod(a,b) = a - b * floor(a/b) 

vos chiffres que vous Substituer obtenir

mod(10,9.2) = 10 - 9.2 * floor(10/9.2) = 0.8 

Voir aussi ici pour une mise en œuvre du rez-de-bcmath: How to ceil, floor and round bcmath numbers?

+1

I love votre approche! Votre calcul a cependant une erreur. '' mod (a, b) = a - b * étage (a/b) '' au lieu de '' mod (a, b) = a/b - b * étage (a/b) ''. Voulez-vous corriger votre réponse afin que je puisse accepter? – Xatoo