我写的iPhone应用程序,其计算由加/减预定成本的单元的总成本执行精确的计算货币。这是工作的罚款,直到我意识到,我用的是浮点值造成的总不准确,所以我开始考虑使用NSDecimalNumber。我现在很困惑,并有一个'超出范围'的错误。下面是我的(简化)代码的相关部分。我如何才能让它按预期工作?如何在iPhone应用程序
MyViewController.h
#import <UIKit/UIKit.h>
@interface MyViewController : UIViewController {
IBOutlet UILabel *totalPrice;
NSDecimalNumber *total;
NSDecimalNumber *item1Price;
}
@property (retain, nonatomic) NSDecimalNumber *total;
@property (retain, nonatomic) UILabel *totalPrice;
- (IBAction)addItem:(id)sender;
- (void)getDefaults;
- (void)setLabels;
@end
MyViewController.m
#import "MyViewController.h"
@implementation MyViewController
@synthesize total;
@synthesize totalPrice;
- (void)getDefaults {
NSString *path = [[NSBundle mainBundle] pathForResource:@"prices" ofType:@"plist"];
NSDictionary *dict = [[NSDictionary alloc] initWithContentsOfFile:path];
total = [NSDecimalNumber decimalNumberWithString:@"0"];
item1Price = (NSDecimalNumber *)[dict valueForKey:@"item1"];
}
- (void)setLabels {
NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init];
[numberFormatter setFormatterBehavior:NSNumberFormatterBehavior10_4];
[numberFormatter setCurrencySymbol:@"£"];
[numberFormatter setNumberStyle:NSNumberFormatterCurrencyStyle];
totalPrice.text = [numberFormatter stringFromNumber:total];
}
- (void)viewDidLoad {
[self getDefaults];
[self setLabels];
}
- (IBAction)addItem:(id)sender {
NSDecimalNumber *itemPrice;
switch ([sender tag]) {
case 1:
itemPrice = item1Price;
break;
}
total = [total decimalNumberByAdding:itemPrice];
NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init];
[numberFormatter setFormatterBehavior:NSNumberFormatterBehavior10_4];
[numberFormatter setCurrencySymbol:@"£"];
[numberFormatter setNumberStyle:NSNumberFormatterCurrencyStyle];
totalPrice.text = [numberFormatter stringFromNumber:total];
}
@end
我希望我在正确的道路上......
很多时候,金钱计算是用整数,乘以100(或1K或10K),做数学,然后将它们分开(参见谷歌的货币计算算法)。花车太不准确(.1 + .2并不是必需的.3)。 – KevinDTimm 2009-12-04 16:32:14
“范围外”错误和var名称是什么? – zaph 2009-12-04 16:39:27
当我添加一个项目时,总变量超出了范围,但是我的问题更多的是如何“正确地”执行此操作,而不是专门修复当前的错误,除非这两个问题的答案当然会发生要一样! – 2009-12-04 16:44:09