@interface CalculationTool : NSObject
/*
NSDecimalNumber的简单加减乘除法,保证精确度问题
*/
//MARK:--NSDecimalNumber加法
+(NSString *)addForNumber1:(NSString *)number1 withNumber2:(NSString *)number2;
//MARK:--NSDecimalNumber减法
+(NSString *)subtractionForNumber1:(NSString *)number1 withNumber2:(NSString *)number2;
//MARK:--NSDecimalNumber乘法
+(NSString *)multiplicationForNumber1:(NSString *)number1 withNumber2:(NSString *)number2;
//MARK:--NSDecimalNumber除法
+(NSString *)divisionForNumber1:(NSString *)number1 withNumber2:(NSString *)number2;
//MARK:--NSDecimalNumber次方
+(NSString *)powerForNumber1:(NSString *)number1 withPower:(NSInteger)power;
//MARK:-- 保留精确度
+ (NSString *)precisionDecimalWithString:(NSString *)decimalStr scale:(int)scale;
+ (NSString *)precisionDecimalWithString:(NSString *)decimalStr scale:(int)scale removeDot:(BOOL)removeDot;
@end
#import "CalculationTool.h"
@implementation CalculationTool
//MARK:--NSDecimalNumber加法
+(NSString *)addForNumber1:(NSString *)number1 withNumber2:(NSString *)number2{
if (!number1) {
number1 = @"0";
}
if (!number2) {
number2 = @"0";
}
NSDecimalNumber *number11 = [NSDecimalNumber decimalNumberWithString:number1];
NSDecimalNumber *number22 = [NSDecimalNumber decimalNumberWithString:number2];
NSDecimalNumber *numberTotal = [number11 decimalNumberByAdding:number22];
NSString *numberTotalStr = [NSString stringWithFormat:@"%@",numberTotal];
return numberTotalStr;
}
//MARK:--NSDecimalNumber减法
+(NSString *)subtractionForNumber1:(NSString *)number1 withNumber2:(NSString *)number2{
if (!number1) {
number1 = @"0";
}
if (!number2) {
number2 = @"0";
}
NSDecimalNumber *number11 = [NSDecimalNumber decimalNumberWithString:number1];
NSDecimalNumber *number22 = [NSDecimalNumber decimalNumberWithString:number2];
NSDecimalNumber *numberTotal = [number11 decimalNumberBySubtracting:number22];
NSString *numberTotalStr = [NSString stringWithFormat:@"%@",numberTotal];
return numberTotalStr;
}
//MARK:--NSDecimalNumber乘法
+(NSString *)multiplicationForNumber1:(NSString *)number1 withNumber2:(NSString *)number2{
if (!number1) {
number1 = @"0";
}
if (!number2) {
number2 = @"0";
}
NSDecimalNumber *number11 = [NSDecimalNumber decimalNumberWithString:number1];
NSDecimalNumber *number22 = [NSDecimalNumber decimalNumberWithString:number2];
NSDecimalNumber *numberTotal = [number11 decimalNumberByMultiplyingBy:number22];
NSString *numberTotalStr = [NSString stringWithFormat:@"%@",numberTotal];
return numberTotalStr;
}
//MARK:--NSDecimalNumber除法
+(NSString *)divisionForNumber1:(NSString *)number1 withNumber2:(NSString *)number2{
if (!number1) {
number1 = @"0";
}
if (!number2 | [number2 isEqualToString:@"0"]) {
number2 = @"1";
}
NSDecimalNumber *number11 = [NSDecimalNumber decimalNumberWithString:number1];
NSDecimalNumber *number22 = [NSDecimalNumber decimalNumberWithString:number2];
NSDecimalNumber *numberTotal = [number11 decimalNumberByDividingBy:number22];
NSString *numberTotalStr = [NSString stringWithFormat:@"%@",numberTotal];
return numberTotalStr;
}
//MARK:--NSDecimalNumber次方
+(NSString *)powerForNumber1:(NSString *)number1 withPower:(NSInteger)power{
if (!number1) {
number1 = @"0";
}
if (!power) {
power = 1;
}
NSDecimalNumber *number11 = [NSDecimalNumber decimalNumberWithString:number1];
NSDecimalNumber *numberTotal = [number11 decimalNumberByRaisingToPower:power];
NSString *numberTotalStr = [NSString stringWithFormat:@"%@",numberTotal];
return numberTotalStr;
}
+ (NSString *)precisionDecimalWithString:(NSString *)decimalStr scale:(int)scale removeDot:(BOOL)removeDot{
NSString * calculate= [self precisionDecimalWithString:decimalStr scale:scale];
NSMutableString *appendStr = [NSMutableString stringWithString:calculate];
if (![calculate containsString:@"."]) {
[appendStr appendString:@"."];
}
NSString * dotSuffix = [appendStr componentsSeparatedByString:@"."].lastObject;
NSInteger count = scale - dotSuffix.length;
for (NSInteger i = 0; i < count; i++) {
[appendStr appendString:@"0"];
}
if (removeDot) {
return calculate;
}else{
return appendStr;
}
}
//MARK:--取精度 只舍不入
+ (NSString *)precisionDecimalWithString:(NSString *)decimalStr scale:(int)scale{
// 有效数调整:scale:小数位数。 其他参数:都是异常处理 YES 返回异常! NO 忽略
NSDecimalNumberHandler *handler = [[NSDecimalNumberHandler alloc] initWithRoundingMode:NSRoundDown
scale:scale
raiseOnExactness:NO
raiseOnOverflow:NO
raiseOnUnderflow:NO
raiseOnDivideByZero:YES];
NSDecimalNumber *decimal = [NSDecimalNumber decimalNumberWithString:decimalStr];
NSDecimalNumber *precisionDecimal = [decimal decimalNumberByRoundingAccordingToBehavior:handler];
NSString *calculate = precisionDecimal.stringValue;
return calculate;
}