当前位置:  开发笔记 > 数据库 > 正文

如何使用NSDecimalNumber?

如何解决《如何使用NSDecimalNumber?》经验,为你挑选了3个好方法。

我正在构建一个需要对钱进行计算的应用程序.

我想知道如何正确使用NSDecimalNumber,尤其是如何从整数,浮点数和双精度初始化它?

我发现只使用这种-decimalNumberWithString:方法很容易.-initWith...不鼓励使用这些方法,只留下带有尾数的方法,但从来没有使用我之前使用过的7种语言中的任何一种语言,所以我不知道是什么放在那里......



1> Ashley Clark..:

千万不要使用NSNumber+numberWith...方法来创建NSDecimalNumber对象.它们被声明为返回NSNumber对象,并不保证作为NSDecimalNumber实例运行.

这是在这个解释线程比尔布姆加纳,在苹果开发者.我鼓励你提出一个针对这种行为的bug,引用bug rdar:// 6487304.

作为替代方案,这些是用于创建的所有适当方法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;

如果你只是想NSDecimalNumber从一个floatint不断尝试这样的事情:

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


另外,正如下面的@orj所说,使用`-initWithFloat:`,`-initWithDouble:`和其他方法也是正确的.这些被声明为返回`id`,我刚刚确认他们确实在Snow Leopard上返回了一个`NSDecimalNumber`.
+1提及`NSNumber`的`decimalValue`.我在文档中完全错过了那个.

2> orj..:

正确的方法实际上是这样做的:

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]);

在这里查看更多信息.



3> Brad Larson..:

在设计方面,您应该尽量避免将NSDecimalNumber或NSDecimals转换为int,float和double值,原因与推荐使用NSDecimalNumbers的原因相同:精度损失和二进制浮点表示问题.我知道,有时它是不可避免的(从滑块输入,进行三角计算等),但你应该尝试从用户那里获取输入作为NSStrings然后使用initWithString:locale:或decimalNumberWithString:locale:来生成NSDecimalNumbers.使用NSDecimalNumbers完成所有数学运算并将其表示返回给用户,或使用descriptionWithLocale:将它们保存为SQLite(或任何地方)作为其字符串描述.

如果必须从int,float或double输入,则可以执行以下操作:

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

或者你可以按照Ashley的建议来确保你在十进制结构中是安全的.

推荐阅读
夏晶阳--艺术
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有