關于數(shù)值的計算就是按照字符串直接轉(zhuǎn)doubleValue的方式轉(zhuǎn)化為后進行加減乘除運算。這樣做在大多數(shù)情況下是不會有問題的掀序,但如果經(jīng)過全面測試的話八回,有些字符串轉(zhuǎn)double會出現(xiàn)精度損失問題岩遗,計算結(jié)果也會出現(xiàn)不準確的問題.
NSDecimalNumber是蘋果提供的專門金融貨幣精確數(shù)值計算的API萄焦。
+ (instancetype)decimalNumberHandlerWithRoundingMode:(NSRoundingMode)roundingMode
scale:(short)scale
raiseOnExactness:(BOOL)raiseOnExactness
raiseOnOverflow:(BOOL)raiseOnOverflow
raiseOnUnderflow:(BOOL)raiseOnUnderflow
raiseOnDivideByZero:(BOOL)raiseOnDivideByZero
參數(shù) | 說明 |
---|---|
roundingMode | 要使用的舍入模式控轿,有四種值: NSRoundUp, NSRoundDown, NSRoundPlain, and NSRoundBankers |
scale | 結(jié)果保留幾位小數(shù) |
raiseOnExactness | 發(fā)生精確錯誤時是否拋出異常,一般為NO |
raiseOnOverflow | 發(fā)生溢出錯誤時是否拋出異常,一般為NO |
raiseOnUnderflow | 發(fā)生不足錯誤時是否拋出異常解幽,一般為NO |
raiseOnDivideByZero | 被0除時是否拋出異常,一般為YES |
RoundingMode 舍入模式 官方注釋
// Rounding policies :
// Original
// value 1.2 1.21 1.25 1.35 1.27
// Plain 1.2 1.2 1.3 1.4 1.3
// Down 1.2 1.2 1.2 1.3 1.2
// Up 1.2 1.3 1.3 1.4 1.3
// Bankers 1.2 1.2 1.2 1.4 1.3
參數(shù) | 說明 |
---|---|
NSRoundPlain | // Round up on a tie烘苹, 標準四舍五入模式 |
NSRoundDown | // Always down == truncate 截斷所有超出部分 |
NSRoundUp | // Always up躲株, 進一法 |
NSRoundBankers | // on a tie round so last digit is even 特殊的四舍五入.最后一位是5的情況下,如果前一位是偶數(shù)則舍棄镣衡,前一位是奇數(shù)則進一位 |
NSDecimalNumber是進行數(shù)值計算的對象霜定,ji所有的加減乘除,冪運算操作對象廊鸥。
NSDecimalNumberHandler *handler = [NSDecimalNumberHandler decimalNumberHandlerWithRoundingMode:NSRoundBankers
scale:2
raiseOnExactness:NO
raiseOnOverflow:NO
raiseOnUnderflow:NO
raiseOnDivideByZero:YES];
NSDecimalNumber *num1 = [NSDecimalNumber decimalNumberWithString:[NSString stringWithFormat:@"%@",@"2.37"]];
NSDecimalNumber *num2 = [NSDecimalNumber decimalNumberWithString:[NSString stringWithFormat:@"%@",@"15.89"]];
//加
NSDecimalNumber *addResult = [num1 decimalNumberByAdding:num2
withBehavior:handler];
//減
NSDecimalNumber *subtractResult = [num1 decimalNumberBySubtracting:num2
withBehavior:handler];
//乘
NSDecimalNumber *multiplyResult = [num1 decimalNumberByMultiplyingBy:num2
withBehavior:handler];
//除
NSDecimalNumber *divideResult = [num1 decimalNumberByDividingBy:num2
withBehavior:handler];
//平方
NSDecimalNumber *powerResult = [num1 decimalNumberByRaisingToPower:2
withBehavior:handler];
NSLog(@"\n%f\n%f\n%f\n%f\n%f",[addResult doubleValue],[subtractResult doubleValue],[multiplyResult doubleValue],[divideResult doubleValue],[powerResult doubleValue]);
計算結(jié)果僅用于顯示作用望浩,計算必須使用原數(shù)值進行計算,結(jié)果使用公式轉(zhuǎn)換進行顯示惰说。