問題源于自己做的一個字符串單位換算的擴(kuò)展方法岂却,目的是把一大串?dāng)?shù)字轉(zhuǎn)換成萬泉唁、百萬等為單位雷酪。
最開始的時候,思路很簡單 直接把String轉(zhuǎn)成float(float最高能表示到3.4*10^38,一般來說夠用了),判斷下要顯示哪個單位,除一下就好了圆兵,然后就有了以下的代碼:
+(NSString *)unitStringFromString:(NSString *)numberStr{
NSString *resultStr = nil;
CGFloat nfloat = [numberStr floatValue];
CGFloat resultFloat = 0;
NSString *resultUnit = @"";
//0~5位數(shù)不變跺讯,6~8位數(shù)轉(zhuǎn)換為**萬,9-12位數(shù)轉(zhuǎn)換為**億殉农,12位數(shù)以上轉(zhuǎn)化為**萬億
if (nfloat/100000<1) {
return numberStr;
}else if(nfloat/100000000<1){
resultFloat = nfloat/10000.f;
resultUnit = @"萬";
}else if(nfloat/1000000000000<1){
resultFloat = nfloat/100000000.f;
resultUnit = @"億";
}else{
resultFloat = nfloat/1000000000000.f;
resultUnit = @"萬億";
}
//這里直接保持小數(shù)點后所有位數(shù)刀脏,并去除多余的0
resultStr = [NSString stringWithFormat:@"%@%@",@(resultFloat),resultUnit];
//或者直接保留兩位小數(shù)
//resultStr = [NSString stringWithFormat:@"%.2f%@",resultFloat,resultUnit];
return resultStr;
}
那么問題來了:當(dāng)保留所有小數(shù)位數(shù)的時候,得出來的結(jié)果與預(yù)期的并不相同超凳,例如:
numberStr = @"108649330";
全部的輸出結(jié)果為=>
resultStr = @"1.08649328億";
保留兩位小數(shù)的結(jié)果為=>
resultStr = @"1.09億";
我們發(fā)現(xiàn)保留兩位小數(shù)時的數(shù)據(jù)沒有問題愈污,但是全部輸出時,會有一定的誤差轮傍。
我們想要的效果是暂雹,去除小數(shù)點后多余的0,并且最多保留兩位小數(shù)创夜,所以添加了一些代碼:
//這里保留兩位小數(shù)杭跪,并去除多余的0
NSString *tempStr = [NSString stringWithFormat:@"%.2f",resultFloat];
resultStr = [NSString stringWithFormat:@"%@%@",@([tempStr floatValue]),resultUnit];
這樣就能達(dá)到想要的效果了。
但是驰吓,有沒有更精確的方法來計算兩個浮點數(shù)的運(yùn)算呢涧尿?
后來發(fā)現(xiàn)了這篇文章 關(guān)于OC中的小數(shù)精確計算---NSDecimalNumber
文中,提到了NSDecimalNumber是用于OC中精確計算的檬贰,所以我將上面的代碼修改為:
+(NSString *)unitStringFromString:(NSString *)numberStr{
NSString *resultStr = nil;
NSDecimalNumber *decNumber = [NSDecimalNumber decimalNumberWithString:numberStr];
NSString *devisor;
NSString *resultUnit = @"";
CGFloat nfloat = [numberStr floatValue];
//0~5位數(shù)不變姑廉,6~8位數(shù)轉(zhuǎn)換為**萬,9-12位數(shù)轉(zhuǎn)換為**億翁涤,12位數(shù)以上轉(zhuǎn)化為**萬億
if (nfloat/100000<1) {
devisor = @"1";
resultUnit = @"";
}else if(nfloat/100000000<1){
devisor = @"10000";
resultUnit = @"萬";
}else if(nfloat/1000000000000<1){
devisor = @"100000000";
resultUnit = @"億";
}else{
devisor = @"1000000000000";
resultUnit = @"萬億";
}
NSDecimalNumber *divisorNumber = [NSDecimalNumber decimalNumberWithString:devisor];
NSDecimalNumber *resultDec = [decNumber decimalNumberByDividingBy:divisorNumber];
//直接輸出結(jié)果
//resultStr = [resultDec stringValue];
//resultStr = [NSString stringWithFormat:@"%@%@",resultStr,resultUnit];
//這里保留兩位小數(shù)桥言,并去除多余的0
NSString *tempStr = [NSString stringWithFormat:@"%.2f",[resultDec floatValue]];
resultStr = [NSString stringWithFormat:@"%@%@",@([tempStr floatValue]),resultUnit];
return resultStr;
}
以上,問題解決葵礼。