相关疑难解决方法(0)

如何使用NSDecimalNumber?

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

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

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

math cocoa

43
推荐指数
3
解决办法
4万
查看次数

NSDecimal,NSDecimalNumber,CFNumber之间的正确选择是什么?

我已经阅读了很多关于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,但我想知道两件事:

  1. 内存开销和性能损失是否可以接受更复杂的类(仅在UITableView中显示此类财务计算)?我在C中没有太多背景......
  2. 使用像这样的功能不是太过于挑剔和复杂decimalNumberByAdding:吗?使用Python,很容易定义__add__使用运算符和对象.我应该从中获取浮点值NSDecimalNumber …

iphone cocoa objective-c key-value-coding

28
推荐指数
2
解决办法
1万
查看次数

有没有办法在不使用NSNumber和创建自动释放对象的情况下创建NSDecimal?

我正在使用以下技术执行大量计算NSDecimal并创建每个NSDecimal结构:

[[NSNumber numberWithFloat:kFloatConstant] decimalValue]
Run Code Online (Sandbox Code Playgroud)

NSDecimal用来避免使用自动释放的NSDecimalNumber对象(如果使用NSDecimalNumber精确计算的方法).但是,似乎NSNumber创建机制还返回一个自动释放NSNumber的十进制值.

有没有办法创建一个NSDecimal不使用NSNumber和创建自动释放的对象?

objective-c autorelease ios

17
推荐指数
1
解决办法
2万
查看次数

NSNumberFormatter是格式化NSDecimalNumber的唯一方法吗?

我正在使用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)

iphone cocoa objective-c

11
推荐指数
2
解决办法
8038
查看次数

可可 - 我发现了我认为是NSDecimalNumber的错误

这是一个简单的代码,显示我认为处理双数时的错误...

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现在有更多的数字!!!!

iphone cocoa iphone-sdk-3.0

5
推荐指数
1
解决办法
667
查看次数

如何将NSDecimalNumber除以整数?

我不认为这里存在一个全面,基本的答案,谷歌搜索没有帮助.

任务: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)

当然,这可以通过更简单的方式完成吗?

cocoa ios

4
推荐指数
1
解决办法
3718
查看次数