我正在构建一个需要对钱进行计算的应用程序.
我想知道如何正确使用NSDecimalNumber,尤其是如何从整数,浮点数和双精度初始化它?
我发现只使用这种-decimalNumberWithString:方法很容易.-initWith...不鼓励使用这些方法,只留下带有尾数的方法,但从来没有使用我之前使用过的7种语言中的任何一种语言,所以我不知道是什么放在那里......
我已经阅读了很多关于NSDecimal,NSNumber,NSNumberDecimal,CFNumber ......它开始对我来说是一种丛林.
基本上,我正在尝试创建一个简单的模型类来处理简单的计算,如下所示:
#import <Foundation/Foundation.h>
@interface Test : NSObject
{
float rate;
float amount;
int duration;
}
- (float)capitalizedAmount;
@end
@implementation Test
- (float)capitalizedAmount {
return (amount*pow((1.0+rate),duration));
}
@end
Run Code Online (Sandbox Code Playgroud)
我想以名字作为字符串来访问这些方法和setter,因为我打算有很多其他类这样的类,我只保留一个字段列表来进行键值编码.
// This is just the desired behavior
// This evidently won't work with the previous class definition
Test *obj = [[Test alloc] init];
[NSNumber numberWithInt:10]
...
float r;
r = [obj performSelector:NSSelectorFromString(@"capitalizedAmount")];
Run Code Online (Sandbox Code Playgroud)
我知道这是不可能的,performSelector:它将返回一个对象,因此它capitalizedAmount应该返回一个对象.我已经阅读NSInvocation了关于comp.lang的Objective-C Faq的相关内容和相关部分.
我也明白我应该使用NSDecimalNumber,但我想知道两件事:
decimalNumberByAdding:吗?使用Python,很容易定义__add__使用运算符和对象.我应该从中获取浮点值NSDecimalNumber …我正在使用以下技术执行大量计算NSDecimal并创建每个NSDecimal结构:
[[NSNumber numberWithFloat:kFloatConstant] decimalValue]
Run Code Online (Sandbox Code Playgroud)
我NSDecimal用来避免使用自动释放的NSDecimalNumber对象(如果使用NSDecimalNumber精确计算的方法).但是,似乎NSNumber创建机制还返回一个自动释放NSNumber的十进制值.
有没有办法创建一个NSDecimal不使用NSNumber和创建自动释放的对象?
我正在使用NSDecimalNumber在Core Data中存储资金.我天真地使用stringWithFormat:首先要格式化值,后来意识到它不支持NSDecimalNumber而是格式化指针:(.所以在通过文档阅读之后我学会了使用NSNumberFormatter来获取我想要的格式.但这只是让我觉得"艰难的道路".有没有比这更简单的方法:?
NSNumberFormatter * formatter = [[NSNumberFormatter alloc] init];
[formatter setNumberStyle: NSNumberFormatterCurrencyStyle];
priceField.text = [formatter stringFromNumber: ent.price];
[formatter release];
Run Code Online (Sandbox Code Playgroud) 这是一个简单的代码,显示我认为处理双数时的错误...
double wtf = 36.76662445068359375000;
id xxx = [NSDecimalNumber numberWithDouble: wtf];
NSString *myBug = [xxx stringValue];
NSLog(@"%.20f", wtf);
NSLog(@"%@", myBug);
NSLog(@"-------\n");
Run Code Online (Sandbox Code Playgroud)
终端将显示两个不同的号码
36.76662445068359375000和
36.76662445068359168
这是一个错误还是我错过了什么?
如果第二个数字被舍入,那是一个非常奇怪的四舍五入...
= = = = = = = = = =
我正在编辑原始问题以包含一个WTF错误...
试试这个:
修改原始数字并在10位十进制数字上截断...所以......
double wtf = 36.76662445068359375000;
NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
[formatter setMaximumFractionDigits:10];
NSString *valueX = [formatter stringFromNumber:[NSDecimalNumber numberWithDouble:wtf]];
[formatter release];
NSLog(@"%@", valueX);
Run Code Online (Sandbox Code Playgroud)
现在的答案是36.7666244507
现在该值是一个包含10位十进制数字的字符串...现在让我们将其转换回double
double myDoubleAgain = [valueX doubleValue];
NSLog(@"%.20f", myDoubleAgain);
Run Code Online (Sandbox Code Playgroud)
答案是36.76662445070000018177 ??????
myDoubleAgain现在有更多的数字!!!!
我不认为这里存在一个全面,基本的答案,谷歌搜索没有帮助.
任务:NSDecimalNumber将此除以a int并返回另一个NSDecimalNumber.
澄清:amount_text下面必须转换为NSDecimalNumber,因为它是一种货币.结果必须是NSDecimalNumber,但我不关心除数的格式.
到目前为止我所拥有的:
// Inputs
NSString *amount_text = @"15.3";
int n = 10;
NSDecimalNumber *total = [NSDecimalNumber decimalNumberWithString:amount_text];
// Take int, convert to string. Take string, convert to NSDecimalNumber.
NSString *int_string = [NSString stringWithFormat:@"%d", n];
NSDecimalNumber *divisor = [NSDecimalNumber decimalNumberWithString:int_string];
NSDecimalNumber *contribution = [total decimalNumberByDividingBy:divisor];
Run Code Online (Sandbox Code Playgroud)
当然,这可以通过更简单的方式完成吗?