需求:
1.客戶端模仿微信的提現(xiàn)功能诀浪,具體提現(xiàn)操作可以試玩一下你的微信提現(xiàn)操作磕昼;
2.提現(xiàn)涉及到手續(xù)費(fèi)的計算,客戶端計算的手續(xù)費(fèi)和后臺計算的手續(xù)費(fèi)要進(jìn)行對比钱雷,有點(diǎn)坑哈骂铁!
3.既然進(jìn)行對比,那就要設(shè)定規(guī)則標(biāo)準(zhǔn):
需要精確數(shù)值計算罩抗;
小數(shù)點(diǎn)后精確保留2位數(shù)字拉庵;
怎么舍去小數(shù)點(diǎn)2位后數(shù)字,小數(shù)點(diǎn)后兩位之后若有數(shù)字都需進(jìn)1(既然是提現(xiàn)套蒂,咋可不能吃虧呀钞支!),也就是只入不舍或者是無窮舍進(jìn)泣懊。
還有一些困難:用戶在UITextField輸入具體金額伸辟,我們拿到的數(shù)據(jù)也是NSString類型的金額,然后轉(zhuǎn)化成CGFloat類型的等等進(jìn)行計算馍刮,但是這樣計算出來的數(shù)據(jù)值就不準(zhǔn)確了信夫,所以第1條必須要保證精確數(shù)值計算。
沒辦法卡啰,就找了下資料静稻,找到了蘋果有專門的API,針對金融貨幣單位:
NSDecimalNumber --> 解決計算NSString類型精度問題
NSDecimalNumberHandler --> 解決上面的就算結(jié)果如何取舍以及需要保留的精度(小數(shù)點(diǎn)位數(shù))
希望可以解決有遇到同樣問題的人匈辱。
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
tempStr1 = @"88";
tempStr2 = @"0.2%";
[self decimalNumberMutiplyWithString:tempStr1 with:tempStr2];
}
/**
客戶端手續(xù)費(fèi)計算方法并解決金額精度問題
參考博客:
http://www.th7.cn/Program/IOS/201608/937405.shtml
http://blog.csdn.net/yuwuchaio/article/details/50637942
@param amountValue 用戶輸入的具體金額
@param rateValue 后臺給予的費(fèi)率
@return 客戶端計算出的手續(xù)費(fèi)
*/
-(NSString *)decimalNumberMutiplyWithString:(NSString *)amountValue with:(NSString *)rateValue{
/*手續(xù)費(fèi)計算精度問題解決:NSDecimalNumber
加減乘除:
decimalNumberByAdding
decimalNumberBySubtracting:
decimalNumberByMultiplyingBy:
decimalNumberByDividingBy:
*/
NSDecimalNumber *rateValueNumber = [NSDecimalNumber decimalNumberWithString:rateValue];
NSDecimalNumber *oneHundredValueNumber = [NSDecimalNumber decimalNumberWithString:[NSString stringWithFormat:@"%d", 100]];
NSDecimalNumber *division = [rateValueNumber decimalNumberByDividingBy:oneHundredValueNumber];
NSDecimalNumber *amountValueNumber = [NSDecimalNumber decimalNumberWithString:amountValue];
NSDecimalNumber *product = [amountValueNumber decimalNumberByMultiplyingBy:division];
NSLog(@"%@", [product stringValue]);
/*四舍五入精確度問題解決:NSDecimalNumberHandler
講述下參數(shù)的含義:
RoundingMode: 簡單講就是你要四舍五入操作的標(biāo)準(zhǔn).
枚舉
NSRoundPlain, //Round up on a tie //貌似取整
NSRoundDown, //Always down == truncate //只舍不入
NSRoundUp, // Always up //只入不舍
NSRoundBankers // on a tie round so last digit is even 貌似四舍五入
scale : 需要保留的精度振湾。
raiseOnExactness : 為YES時在處理精確時如果有錯誤,就會拋出異常亡脸。
raiseOnOverflow : YES時在計算精度向上溢出時會拋出異常押搪,否則返回树酪。
raiseOnUnderflow : YES時在計算精度向下溢出時會拋出異常,否則返回.
raiseOnDivideByZero : YES時大州。當(dāng)除以0時會拋出異常续语,否則返回。
*/
NSDecimalNumberHandler *roundingBehavior = [NSDecimalNumberHandler decimalNumberHandlerWithRoundingMode:NSRoundUp scale:2 raiseOnExactness:NO raiseOnOverflow:NO raiseOnUnderflow:NO raiseOnDivideByZero:NO];
NSString *tempStr =[[product decimalNumberByRoundingAccordingToBehavior:roundingBehavior] stringValue];
NSLog(@"%@",tempStr);
return tempStr;
}
暫時說到這里厦画,后續(xù)也會持續(xù)更新優(yōu)化疮茄,若有問題歡迎留言,共同探討8睢Aκ浴!