您的位置:首页 > 移动开发 > IOS开发

iOS NSDecimalNumber精确数值计算以及小数点后精确保留2位数字

2015-12-05 15:33 429 查看
遇到的问题,从服务器拿的数据NSString类型的,然后转化成CGFloat类型的,数据的值就不准确了,没办法,就找了下资料,找到了苹果有专门的API,针对金融货币单位,希望可以解决有遇到同样问题的人.

NSDecimalNumberHandler *roundUp = [NSDecimalNumberHandler

decimalNumberHandlerWithRoundingMode:NSRoundBankers

scale:2

raiseOnExactness:NO

raiseOnOverflow:NO

raiseOnUnderflow:NO

raiseOnDivideByZero:YES];

枚举

NSRoundPlain, // Round up on a tie //貌似取整

NSRoundDown, // Always down == truncate //只舍不入

NSRoundUp, // Always up // 只入不舍

NSRoundBankers // on a tie round so last digit is even 貌似四舍五入

//90.7049+0.22 然后四舍五入

NSDecimalNumber *subtotal = [NSDecimalNumberdecimalNumberWithString:@"90.7049"];

NSDecimalNumber *discount = [NSDecimalNumberdecimalNumberWithString:@"0.22"];

NSDecimalNumber *total = [subtotal decimalNumberByAdding:discount withBehavior:roundUp];

NSLog(@"Rounded total: %@", total);

NSDecimalNumber*price1 = [NSDecimalNumberdecimalNumberWithString:@"15.99"];

NSDecimalNumber*price2 = [NSDecimalNumberdecimalNumberWithString:@"29.99"];

NSDecimalNumber*coupon = [NSDecimalNumberdecimalNumberWithString:@"5.00"];

NSDecimalNumber*discount = [NSDecimalNumberdecimalNumberWithString:@".90"];

NSDecimalNumber*numProducts = [NSDecimalNumberdecimalNumberWithString:@"2.0"];

NSDecimalNumber *subtotal = [price1 decimalNumberByAdding:price2];

NSDecimalNumber *afterCoupon = [subtotal decimalNumberBySubtracting:coupon];

NSDecimalNumber *afterDiscount = [afterCoupon decimalNumberByMultiplyingBy:discount];

NSDecimalNumber *average = [afterDiscount decimalNumberByDividingBy:numProducts];

NSDecimalNumber*averageSquared = [average decimalNumberByRaisingToPower:2];

的NSLog(@“小计:%@”,加);/ / 45.98

的NSLog(@“优惠券后:%@”,减);/ / 40.98

的NSLog((@“折后:%@”),乘);/ / 36.882

的NSLog(@“每股平均价产品:%@”,平均);/ / 18.441

的NSLog(@“平均价的平方:%@”,averageSquared);/ / 340.070481

//保留小数点后两位

NSDecimalNumberHandler*roundUp = [NSDecimalNumberHandler

decimalNumberHandlerWithRoundingMode:NSRoundUp

scale:2

raiseOnExactness:NO

raiseOnOverflow:NO

raiseOnUnderflow:NO

raiseOnDivideByZero:YES];

//9折后 36.882 有余进位结果 36.89

NSDecimalNumber*subtotal = [NSDecimalNumberdecimalNumberWithString:@"40.98"];

NSDecimalNumber*discount = [NSDecimalNumberdecimalNumberWithString:@".90"];

NSDecimalNumber*total = [subtotal decimalNumberByMultiplyingBy:discount

withBehavior:roundUp];

NSLog(@"Rounded total: %@", total);

//比较大小

NSDecimalNumber*discount1 = [NSDecimalNumberdecimalNumberWithString:@".85"];

NSDecimalNumber*discount2 = [NSDecimalNumberdecimalNumberWithString:@".9"];

NSComparisonResult result = [discount1 compare:discount2];

if (result ==NSOrderedAscending) {

NSLog(@"85%% < 90%%小于");

} else if (result == NSOrderedSame) {

NSLog(@"85%% == 90%%等于");

} elseif (result ==NSOrderedDescending) {

NSLog(@"85%% > 90%%大于");

}

-(NSString *)notRounding:(NSString*)price afterPoint:(NSInteger)position
{
NSDecimalNumberHandler* roundingBehavior = [NSDecimalNumberHandler
decimalNumberHandlerWithRoundingMode:NSRoundDown
scale:position raiseOnExactness:NO
raiseOnOverflow:NO
raiseOnUnderflow:NO
raiseOnDivideByZero:YES];
NSDecimalNumber *ouncesDecimal;
NSDecimalNumber *roundedOunces;

// ouncesDecimal = [[NSDecimalNumber alloc] initWithFloat:price];
ouncesDecimal = [[NSDecimalNumber
alloc]initWithString:price];
roundedOunces = [ouncesDecimal decimalNumberByRoundingAccordingToBehavior:roundingBehavior];

// return roundedOunces;// 整数的不带小数点
NSString* string = [NSString
stringWithFormat:@"%@",roundedOunces];
if ([string
rangeOfString:@"."].length==0) {
string= [string stringByAppendingString:@".00"];

}else{
NSRange range = [string
rangeOfString:@"."];
if (string.length-range.location-1==2)
{

}else{
string= [string stringByAppendingString:@"0"];
}
}

return string;//整数.00格式
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: