8
votes

Comment obtenez-vous l'int et le modulo (mod) de la division avec un nsdecimalnumberNombre

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?


0 commentaires

5 Réponses :


1
votes

Vous pouvez théoriquement faire des astuces avec les méthodes Nsdecimalnumnumber DecimalnumberByDIVIDYDY: , décimalnumberbymultiphon, et décimalvalue . 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.

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 non signéLonglongvalue .


0 commentaires

6
votes
  1. Divisez le dividende par le diviseur, arrondi. Cela vous obtient le quotient.
  2. Multipliez le diviseur par le quotient.
  3. Soustrayez cela du dividende. Cela vous obtient le reste.

    (37.50 // 5) == 7; 7 * 5 == 35; 37.50 - 35 = 2,50.

    (note: // 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 // pour la division Code Objective-C.)


4 commentaires

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: 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 ci-dessous qui prend soin de ces cas.



8
votes

Utilisation d'exemple Peter Hoseys, mais avec code iOS: xxx


1 commentaires

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;



6
votes

Voici une catégorie nsdecimalnumate qui fonctionne également avec des nombres négatifs et des diviseurs négatifs: xxx


0 commentaires

2
votes

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
 { ...


0 commentaires