Je suis confus par NsdecimalNumber et ses "comportements". J'ai un nsdecimalnumé qui représente une valeur en dollars, disons 37,50 $. J'aimerais savoir combien de fois disent que 5.0 va dans ce numéro, puis sachez ce qui reste encore. Je peux obtenir la division droite et obtenir 7,50 mais je veux 7 mod 2.50. Je pourrais convertir en un entier mais besoin de sauvegarder les "cents" alors se demandant s'il y a des astuces dans le cadre? P>
5 Réponses :
Vous pouvez théoriquement faire des astuces avec les méthodes Nsdecimalnumnumber Le moyen plus facile de le faire, cependant, serait probablement de comprendre la précision maximale que vous souhaitez (appelez-les n places après le point décimal), multipliez le nombre par 10en, puis attrapez la valeur entière et faites votre division. et mod à cela. Vous courez le risque de perte de données, en particulier avec de très grands nombres, cependant, vérifiez le plus grand nombre que vous souhaitez et déterminez quel type de données - si tout - fonctionnera pour vous. Nsnumber prend le support DecimalnumberByDIVIDYDY: code>,
décimalnumberbymultiphon, code> et
décimalvalue code>. Divisez les chiffres, saisissez la structure du nombre décimal, calculez le reste de la structure, puis créez un nouveau nombre décimal avec celui-ci et multipliez ce reste par le nombre d'origine. P>
non signéLonglongvalue code>. P>
(37.50 // 5) == 7; 7 * 5 == 35; 37.50 - 35 = 2,50. P>
(note: // code> est l'opérateur de Python pour la division intégrale. Je l'ai emprunté ici. Évidemment, vous ne devriez pas vraiment essayer d'utiliser
// code> pour la division Code Objective-C.) P>
Pour arrondir, utiliser le sol () de Math.h - il faut un double et retourne un double.
Si vous utilisez des nombres décimaux, essayez de rester dans ce type autant que possible. Nommerez-vous à une utilisation de DecimalnumberbyRoundingAccordingtobehavior :.
Mieux encore, utilisez décimalnumberbyBlidingby: withbehavior: code> faire la division. Ensuite, vous n'avez pas besoin de tourner séparément.
Notez que cela ne fonctionne pas correctement avec un dividende négatif ou un diviseur négatif. J'ai posté une catégorie nsdecimalnumate code> ci-dessous qui prend soin de ces cas.
Utilisation d'exemple Peter Hoseys, mais avec code iOS:
Vous devez définir le mode d'arrondi droit si l'un des dividendes ou un diviseur est négatif. NsroundingMode RoundingMode = ((dividende.floatvalue <0) ^ (divisor.floatvalue <0))? Nsroundup: Nsrounddown; code>
Voici une catégorie nsdecimalnumate code> qui fonctionne également avec des nombres négatifs et des diviseurs négatifs:
Même solution à Swift 4:
let dividend = NSDecimalNumber(string: Price) let divisor = NSDecimalNumber(decimal: 0.05) let quotient = dividend.dividing(by: divisor, withBehavior: NSDecimalNumberHandler(roundingMode: .down, scale: 0, raiseOnExactness: false, raiseOnOverflow: false, raiseOnUnderflow: false, raiseOnDivideByZero: false)) let subtractAmount = quotient?.multiplying(by: divisor) let remainder = dividend.subtracting(anAmount) if remainder != 0 { ...