開發過程中遇到的問題,從服務器拿的數據NSString類型的,然後轉化成CGFloat類型的,數據的值就不準確了,沒辦法,就找了下資料,找到了蘋果有專門的API,針對金融貨幣單位,希望可以解決有遇到同樣問題的人。
一、NSDecimalNumber的基本運算
NSDecimalNumber *decOneNum = [[NSDecimalNumber alloc] initWithFloat:oneNum];
NSDecimalNumber *decTwoNum = [[NSDecimalNumber alloc] initWithFloat:twoNum];
NSDecimalNumber *resultNum = [[NSDecimalNumber alloc] init];
/**
初始化方法參數介紹
roundingMode 舍入方式
(
NSRoundPlain, 四捨五入
NSRoundDown, 只舍不入
NSRoundUp, 只入不捨
NSRoundBankers 四捨六入, 中間值時, 取最近的,保持保留最後一位爲偶數
)
scale 小數點後舍入值的位數。例如:2的話就代表保留小數點後2位小數
exact 精度錯誤處理;YES:如果出現錯誤將會引發異常,NO:忽略錯誤。
overflow 溢出錯誤處理;BOOL值意思同上
underflow 下溢錯誤處理;BOOL值意思同上
divideByZero 除以0的錯誤處理;BOOL值意思同上,不過YES的的時候會自動捨去末尾 的0。
NSDecimalNumberHandler對象
*/
NSDecimalNumberHandler *roundingBehavior = [NSDecimalNumberHandler decimalNumberHandlerWithRoundingMode:NSRoundPlain
scale:2
raiseOnExactness:NO
raiseOnOverflow:NO
raiseOnUnderflow:NO
raiseOnDivideByZero:YES];
// 加法
resultNum = [decOneNum decimalNumberByAdding:decTwoNum withBehavior:roundingBehavior];
// 減法
resultNum = [decOneNum decimalNumberBySubtracting:decTwoNum withBehavior:roundingBehavior];
// 乘法
resultNum = [decOneNum decimalNumberByMultiplyingBy:decTwoNum withBehavior:roundingBehavior];
// 除法
resultNum = [decOneNum decimalNumberByDividingBy:decTwoNum withBehavior:roundingBehavior];
二、NSDecimalNumber類型參數的大小比較
NSDecimalNumber *decOneNum = [[NSDecimalNumber alloc] initWithFloat:oneNum];
NSDecimalNumber *decTwoNum = [[NSDecimalNumber alloc] initWithFloat:twoNum];
if ([decOneNumcompare:decTwoNum] == NSOrderedAscending) {
NSLog(@"decOneNum < decTwoNum");
} else if ([decOneNumcompare:decTwoNum] ==NSOrderedDescending){
NSLog(@"decOneNum > decTwoNum");
}else if ([decOneNum compare:decTwoNum] == NSOrderedSame){
NSLog(@"decOneNum = decTwoNum");
}