�需求:�将字符串"12349999"转为字符串"1234.99w"。
首先想到的是先将字符串转为数值,再除去10000,最后拼接字符串。代码如下:
NSString *ret = [NSString stringWithFormat:@"%.2fw", [@"12349999" longLongValue] / 10000.0];
NSLog(@"%@", ret);
结果居然是这个😱 😱。。我勒个去,,,Xcode你不爱我了吗??
~
~
~
于是,“众里寻它千百度,蓦然回首,那人却在灯火阑珊处。” 发现了这个:
NSDecimalNumber
NSDecimalNumberHandler
看了下大概是�可以对小数进行运算及小数位的舍入处理。ok 开撸!!
//需要参与运算的两个数
NSDecimalNumber *num = [NSDecimalNumber decimalNumberWithString:@"12349999"];
NSDecimalNumber *w = [NSDecimalNumber decimalNumberWithString:@"10000"];
//运算结果处理:小数精确到后2位,其余位无条件舍弃
NSDecimalNumberHandler *handler = [NSDecimalNumberHandler
decimalNumberHandlerWithRoundingMode:NSRoundDown//要使用的舍入模式
scale:2 //结果保留几位小数
raiseOnExactness:NO //发生精确错误时是否抛出异常,一般为NO
raiseOnOverflow:NO //发生溢出错误时是否抛出异常,一般为NO
raiseOnUnderflow:NO //发生不足错误时是否抛出异常,一般为NO
raiseOnDivideByZero:YES];//被0除时是否抛出异常,一般为YES
//将两个数进行除法运算,并对结果加以处理(handler)
num = [num decimalNumberByDividingBy:w withBehavior:handler];
NSString *ret = [NSString stringWithFormat:@"%@w", num];
NSLog(@"%@", ret);
搞定收工!!
最后说下当NSRoundingMode取值为NSRoundBankers的时候,代表的是“四舍六入五成双”。 看的几篇博客都没给说说清楚😥 😥 。。
/*************** Type definitions ***********/
// 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
typedef NS_ENUM(NSUInteger, NSRoundingMode) {
NSRoundPlain, // Round up on a tie ###四舍五入
NSRoundDown, // Always down == truncate ###只舍不入
NSRoundUp, // Always up ###只入不舍
NSRoundBankers // on a tie round so last digit is even ###四舍六入五成双
};