47 votes

Comment utiliser NSDecimalNumber?

Je suis en train de construire une application qui a besoin d'effectuer des calculs sur de l'argent.

Je me demande comment les utiliser correctement NSDecimalNumber, en particulier comment l'initialiser à partir de nombres entiers, de flotteurs et doubles?

Je n'ai trouvé facile à utiliser l' -decimalNumberWithString: méthode. L' -initWith... méthodes sont découragés de sorte que seule la gauche, de ceux dont la mantisse, mais jamais à plus de 7 langues que j'ai utilisé avant, j'en ai besoin donc je ne sais pas quoi y mettre...

84voto

Ashley Clark Points 6806

Ne PAS utiliser NSNumbers' +numberWith... méthodes pour créer de l' NSDecimalNumber objets. Elles sont déclarées pour revenir NSNumber objets et ne sont pas garantis pour fonctionner comme NSDecimalNumber des cas.

Ceci est expliqué dans ce fil par le projet de Loi Bumgarner, développeur chez Apple. Je vous encourage à soumettre un rapport de bogue à l'encontre de ce comportement, référencement bug rdar://6487304.

Comme une alternative, ce sont toutes les méthodes à utiliser pour créer un NSDecimalNumber:

+ (NSDecimalNumber *)decimalNumberWithMantissa:(unsigned long long)mantissa
                     exponent:(short)exponent isNegative:(BOOL)flag;
+ (NSDecimalNumber *)decimalNumberWithDecimal:(NSDecimal)dcm;
+ (NSDecimalNumber *)decimalNumberWithString:(NSString *)numberValue;
+ (NSDecimalNumber *)decimalNumberWithString:(NSString *)numberValue locale:(id)locale;

+ (NSDecimalNumber *)zero;
+ (NSDecimalNumber *)one;
+ (NSDecimalNumber *)minimumDecimalNumber;
+ (NSDecimalNumber *)maximumDecimalNumber;
+ (NSDecimalNumber *)notANumber;

Si vous voulez simplement vous NSDecimalNumber d'un float ou int constante essayer quelque chose comme cela:

NSDecimalNumber *dn = [NSDecimalNumber decimalNumberWithDecimal:
                             [[NSNumber numberWithFloat:2.75f] decimalValue];

34voto

orj Points 4480

La manière correcte est fait pour cela:

NSDecimalNumber *floatDecimal = [[[NSDecimalNumber alloc] initWithFloat:42.13f] autorelease];
NSDecimalNumber *doubleDecimal = [[[NSDecimalNumber alloc] initWithDouble:53.1234] autorelease];
NSDecimalNumber *intDecimal = [[[NSDecimalNumber alloc] initWithInt:53] autorelease];

NSLog(@"floatDecimal floatValue=%6.3f", [floatDecimal floatValue]);
NSLog(@"doubleDecimal doubleValue=%6.3f", [doubleDecimal doubleValue]); 
NSLog(@"intDecimal intValue=%d", [intDecimal intValue]);

Voir plus d'informations ici.

7voto

Brad Larson Points 122629

Conception-sage, vous devriez essayer d'éviter de convertir NSDecimalNumber ou NSDecimals et de int, float et double des valeurs pour les mêmes raisons, il est recommandé de les utiliser NSDecimalNumbers: perte de précision et de binaire à virgule flottante problèmes de représentation. Je sais que, parfois, il est inévitable (la prise d'entrée à partir d'un curseur, faire des calculs trigonométriques, etc.), mais vous devriez essayer de prendre une entrée par les utilisateurs comme NSStrings et ensuite utiliser initWithString:paramètres régionaux: ou decimalNumberWithString:locale: pour générer le NSDecimalNumbers. Pour toutes vos maths avec le NSDecimalNumbers et le retour de leur représentation à des utilisateurs ou de les enregistrer pour SQLite (ou partout où) que leur chaîne de description à l'aide de descriptionWithLocale:.

Si vous avez d'entrée à partir d'un int, float ou double, vous pourriez faire quelque chose comme ce qui suit:

int myInt = 3;
NSDecimalNumber *newDecimal = [NSDecimalNumber decimalNumberWithString:[NSString stringWithFormat:@"%d", myInt]];

ou vous pourriez suivre Ashley suggestion pour vous assurer que vous êtes en sécurité dans les décimales de la construction.

-2voto

Ben Alpert Points 30381

Vous pouvez utiliser [NSDecimalNumber numberWithInt:myint] ou similaire. Consultez la documentation de NSNumber, qui est NSDecimalNumber de la super-classe.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X