方法一
CGFloat fl1 = 1.23;
CGFloat fl2 = 1.34;
CGFloat fl3 = 1.35;
CGFloat fl4 = 1.36;
CGFloat fl5 = 1.44;
CGFloat fl6 = 1.45;
CGFloat fl7 = 1.46;
NSLog(@"fl1 = %.1f, fl2 = %.1f, fl3 = %.1f, fl4 = %.1f, fl5 = %.1f, fl6 = %.1f, fl7 = %.1f",fl1,fl2,fl3,fl4,fl5,fl6,fl7);
打印結(jié)果:
fl1 = 1.2, fl2 = 1.3, fl3 = 1.4, fl4 = 1.4, fl5 = 1.4, fl6 = 1.4, fl7 = 1.5
從上邊的打印結(jié)果可以看出當(dāng)前面為1.3的時候最后一位為四舍五入, 當(dāng)前面為1.4的時候最后一位為五舍六入, 這是因為該機(jī)制為當(dāng)要保留的最后一位數(shù)為奇數(shù)時會采用四舍五入, 當(dāng)要保留的最后一位為偶數(shù)時采用五舍六入;
如果想要更多的舍入精度可以采用以下方法二
方法二
這個方法涉及到兩個類:NSDecimalNumber & NSDecimalNumberHandler
// 四舍五入涉及到的NSDecimalNumberHandler
// 類方法: + (instancetype)decimalNumberHandlerWithRoundingMode:(NSRoundingMode)roundingMode scale:(short)scale raiseOnExactness:(BOOL)exact raiseOnOverflow:(BOOL)overflow raiseOnUnderflow:(BOOL)underflow raiseOnDivideByZero:(BOOL)divideByZero;
/*
參數(shù)講解:
RoundingMode 四舍五入的標(biāo)準(zhǔn).
原始值: 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
NSRoundPlain, // Round up on a tie 嚴(yán)格遵守四舍五入
NSRoundDown, // Always down == truncate 直接舍去
NSRoundUp, // Always up 直接進(jìn)一位
NSRoundBankers // on a tie round so last digit is even 進(jìn)位標(biāo)準(zhǔn)同方法一
scale : 需要保留的精度。
raiseOnExactness : 為YES時在處理精確時如果有錯誤额划,就會拋出異常。
raiseOnOverflow : YES時在計算精度向上溢出時會拋出異常,否則返回流码。
raiseOnUnderflow : YES時在計算精度向下溢出時會拋出異常,否則返回.
raiseOnDivideByZero : YES時咕缎。當(dāng)除以0時會拋出異常外厂,否則返回。
*/
NSDecimalNumber *num1 = [NSDecimalNumber decimalNumberWithString:@"1.34"];
NSDecimalNumber *num2 = [NSDecimalNumber decimalNumberWithString:@"1.35"];
NSDecimalNumber *num3 = [NSDecimalNumber decimalNumberWithString:@"1.44"];
NSDecimalNumber *num4 = [NSDecimalNumber decimalNumberWithString:@"1.45"];
NSDecimalNumberHandler *numHandler = [NSDecimalNumberHandler decimalNumberHandlerWithRoundingMode:NSRoundBankers scale:1 raiseOnExactness:NO raiseOnOverflow:NO raiseOnUnderflow:NO raiseOnDivideByZero:NO];
NSString *str1 = [[num1 decimalNumberByRoundingAccordingToBehavior:numHandler] stringValue];
NSString *str2 = [[num2 decimalNumberByRoundingAccordingToBehavior:numHandler] stringValue];
NSString *str3 = [[num3 decimalNumberByRoundingAccordingToBehavior:numHandler] stringValue];
NSString *str4 = [[num4 decimalNumberByRoundingAccordingToBehavior:numHandler] stringValue];
NSLog(@"\n%@,%@",str1,str2);
NSLog(@"\n%@,%@",str3,str4);
打印結(jié)果:
str1 = 1.3,str2 = 1.4
str3 = 1.4,str4 = 1.4
補(bǔ)充:
NSDecimalNumber 同樣可以進(jìn)行加減乘除運(yùn)算:
- (NSDecimalNumber *)decimalNumberByAdding:(NSDecimalNumber *)decimalNumber;
- (NSDecimalNumber *)decimalNumberBySubtracting:(NSDecimalNumber *)decimalNumber;
- (NSDecimalNumber *)decimalNumberByMultiplyingBy:(NSDecimalNumber *)decimalNumber;
- (NSDecimalNumber *)decimalNumberByDividingBy:(NSDecimalNumber *)decimalNumber;
如有錯誤歡迎批評指正.
更多詳細(xì)內(nèi)容可參考蘋果官方文檔:
https://developer.apple.com/reference/foundation/nsdecimalnumber