作用
double num1 = 6.67;
double num2 = 15.666666;
NSLog(@"%f",num1*num2);//結(jié)果:104.496662,不精確
NSDecimalNumber *price = [NSDecimalNumber decimalNumberWithString:@"6.67"];
NSDecimalNumber *totalPrice = [NSDecimalNumber decimalNumberWithString:@"15.666666"];
NSDecimalNumber *amount = [totalPrice decimalNumberByMultiplyingBy:price];
NSLog(@"%@",amount);//結(jié)果104.49666222
用法
加減乘除以及乘方
NSDecimalNumber *price = [NSDecimalNumber decimalNumberWithString:@"6.67"];
NSDecimalNumber *totalPrice = [NSDecimalNumber decimalNumberWithString:@"15.666666"];
NSDecimalNumber *amount = [totalPrice decimalNumberByAdding:price];
NSLog(@"%@",amount);//22.336666
NSDecimalNumber *price = [NSDecimalNumber decimalNumberWithString:@"6.67"];
NSDecimalNumber *totalPrice = [NSDecimalNumber decimalNumberWithString:@"15.666666"];
NSDecimalNumber *amount = [totalPrice decimalNumberBySubtracting:price];
NSLog(@"%@",amount);//8.996666000000001
NSDecimalNumber *price = [[NSDecimalNumber alloc] initWithDouble:6.67];
NSDecimalNumber *totalPrice = [[NSDecimalNumber alloc] initWithDouble:15.666666];
NSDecimalNumber *amount = [totalPrice decimalNumberByMultiplyingBy:price];
NSLog(@"%@",amount);//104.49666222
NSDecimalNumber *price = [[NSDecimalNumber alloc] initWithDouble:6.67];
NSDecimalNumber *totalPrice = [[NSDecimalNumber alloc] initWithDouble:15.666666];
NSDecimalNumber *amount = [totalPrice decimalNumberByDividingBy:price];
NSLog(@"%@",amount);//2.348825487256372
NSDecimalNumber *totalPrice = [[NSDecimalNumber alloc] initWithDouble:2];
NSDecimalNumber *amount = [totalPrice decimalNumberByRaisingToPower:2];
NSLog(@"%@",amount); //4
數(shù)值處理
NSDecimalNumber的公共協(xié)議處理類,可以設置舍入模式以及計算錯誤的處理;配合NSDecimalNumber來使用.
/// 數(shù)值處理
/// @param roundingMode 規(guī)則 NSRoundPlain :四舍五入 NSRoundDown :向下取舍 NSRoundUp:向上取舍 Bankers :特殊四舍五入
/// @param scale 精確到幾位小數(shù)
/// @param raiseOnExactness 精度錯誤處理厢拭;YES:如果出現(xiàn)錯誤述雾,將引發(fā)異常紧唱,NO:忽略錯誤并將控制權放回給調(diào)用者存炮。
/// @param raiseOnOverflow 溢出錯誤處理;YES:如果出現(xiàn)錯誤夺姑,將引發(fā)異常墩邀,NO:忽略錯誤并將控制權放回給調(diào)用者。
/// @param raiseOnUnderflow 下溢錯誤處理盏浙;YES:如果出現(xiàn)錯誤眉睹,將引發(fā)異常,NO:忽略錯誤并將控制權放回給調(diào)用者废膘。
/// @param raiseOnDivideByZero 除以0的錯誤處理竹海;YES:如果出現(xiàn)錯誤,將引發(fā)異常殖卑,NO:忽略錯誤并將控制權放回給調(diào)用者站削。
/**
Bankers :特殊四舍五入
value 1.2 1.21 1.25 1.35 1.27
Bankers 1.2 1.2 1.2 1.4 1.3
*/
NSDecimalNumberHandler *roundingBehavior = [NSDecimalNumberHandler decimalNumberHandlerWithRoundingMode:NSRoundDown scale:3 raiseOnExactness:NO raiseOnOverflow:NO raiseOnUnderflow:NO raiseOnDivideByZero:NO];
NSDecimalNumber *roundedOunces = [amount decimalNumberByRoundingAccordingToBehavior:roundingBehavior];
NSLog(@"%@",roundedOunces); //2.348
簡單使用
//加
- (NSString *)add:(NSString *)string {
NSDecimalNumber *number1 = [NSString getDecimalNumberWithString:self];
NSDecimalNumber *number2 = [NSString getDecimalNumberWithString:string];
return [[number1 decimalNumberByAdding:number2] stringValue];
}
//減
- (NSString *)subtract:(NSString *)string {
NSDecimalNumber *number1 = [NSString getDecimalNumberWithString:self];
NSDecimalNumber *number2 = [NSString getDecimalNumberWithString:string];
return [[number1 decimalNumberBySubtracting:number2] stringValue];
}
//乘
- (NSString *)multiply:(NSString *)string {
NSDecimalNumber *number1 = [NSString getDecimalNumberWithString:self];
NSDecimalNumber *number2 = [NSString getDecimalNumberWithString:string];
return [[number1 decimalNumberByMultiplyingBy:number2] stringValue];
}
//除
- (NSString *)divide:(NSString *)string {
NSDecimalNumber *number1 = [NSString getDecimalNumberWithString:self];
NSDecimalNumber *number2 = [NSString getDecimalNumberWithString:string];
return [[number1 decimalNumberByDividingBy:number2] stringValue];
}
+ (NSDecimalNumber *)getDecimalNumberWithString:(NSString *)string {
if (IsString(string) && fabs([string doubleValue]) > 0) {
return [NSDecimalNumber decimalNumberWithString:string];
}else {
return [NSDecimalNumber decimalNumberWithString:@"0"];
}
}
/**
* 取舍運算
* @param number 要取舍的數(shù)
* @param roundModel 規(guī)則
* @param scale 位數(shù)
* @param keep 是否填充0
*/
+ (NSString *)decimalNumber:(NSString *)number RoundingMode:(NSRoundingMode)roundModel scale:(short)scale isKeep:(BOOL)keep {
if (number == nil) {
return @"--";
}
// 負數(shù)需要反過來
if ([number doubleValue] < 0) {
if (roundModel == NSRoundDown) {
roundModel = NSRoundUp;
}else {
roundModel = NSRoundDown;
}
}
if (scale < 0) {
scale += 1;
}
NSDecimalNumber *decimalNum = [NSDecimalNumber decimalNumberWithString:number];
NSDecimalNumberHandler *roundingBehavior = [NSDecimalNumberHandler decimalNumberHandlerWithRoundingMode:roundModel scale:scale raiseOnExactness:NO raiseOnOverflow:NO raiseOnUnderflow:NO raiseOnDivideByZero:NO];
NSDecimalNumber *roundedNumber = [decimalNum decimalNumberByRoundingAccordingToBehavior:roundingBehavior];
if (scale > 0) {
if (keep == YES) {
NSString *scaleString = [NSString stringWithFormat:@"%%.%df",scale];
return [NSString stringWithFormat:scaleString, roundedNumber.doubleValue];
}else {
return [NSString stringWithFormat:@"%@",roundedNumber];
}
}else {
return [NSString stringWithFormat:@"%lld",roundedNumber.longLongValue];
}
}