NSDecimalNumber簡(jiǎn)介
蘋(píng)果針對(duì)浮點(diǎn)類型計(jì)算精度問(wèn)題提供出來(lái)的計(jì)算類投储,基于十進(jìn)制的科學(xué)計(jì)數(shù)法來(lái)計(jì)算玛歌,同時(shí)可以指定舍入模式昙读,一般用于貨幣計(jì)算。中國(guó)貨幣最小流通單位是分竭讳,也就是小數(shù)點(diǎn)后兩位创葡。
NSDecimalNumberHandler
/**
初始化方法
@param roundingMode 舍入方式
@param scale 小數(shù)點(diǎn)后舍入值的位數(shù)
@param exact 精度錯(cuò)誤處理
@param overflow 溢出錯(cuò)誤處理
@param underflow 下溢錯(cuò)誤處理
@param divideByZero 除以0的錯(cuò)誤處理
@return NSDecimalNumberHandler對(duì)象
*/
+ (instancetype)decimalNumberHandlerWithRoundingMode:(NSRoundingMode)roundingMode scale:(short)scale raiseOnExactness:(BOOL)exact raiseOnOverflow:(BOOL)overflow raiseOnUnderflow:(BOOL)underflow raiseOnDivideByZero:(BOOL)divideByZero;
NSRoundingMode 的類型
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
};
NSRoundPlain 是四舍五入
NSRoundDown 是向下取整
NSRoundUp 是向上取整
NSRoundBankers 是在四舍五入的基礎(chǔ)上,加上末尾數(shù)為5時(shí)绢慢,變成偶數(shù)的規(guī)則
一:四舍五入
// 四舍五入
NSDecimalNumberHandler *roundPlain = [NSDecimalNumberHandler decimalNumberHandlerWithRoundingMode:NSRoundPlain scale:2 raiseOnExactness:NO raiseOnOverflow:NO raiseOnUnderflow:NO raiseOnDivideByZero:YES];
{
NSString *addStr = @"1.0";
NSString *oneStr = @"1.114";
NSString *twoStr = @"1.116";
NSDecimalNumber *oneNum = [NSDecimalNumber decimalNumberWithString:oneStr];
NSDecimalNumber *twoNum = [NSDecimalNumber decimalNumberWithString:twoStr];
NSDecimalNumber *addNum = [NSDecimalNumber decimalNumberWithString:addStr];
// 加法
oneNum = [oneNum decimalNumberByAdding:addNum withBehavior:roundPlain];
twoNum = [twoNum decimalNumberByAdding:addNum withBehavior:roundPlain];
NSLog(@"\n1.114 + 1.0 (保留兩位小數(shù))四舍五入的結(jié)果為:%@\n1.116 + 1.0 (保留兩位小數(shù))四舍五入的結(jié)果為:%@", oneNum, twoNum);
}
二:向下取整
// 向下取整
NSDecimalNumberHandler *roundDown = [NSDecimalNumberHandler decimalNumberHandlerWithRoundingMode:NSRoundDown scale:2 raiseOnExactness:NO raiseOnOverflow:NO raiseOnUnderflow:NO raiseOnDivideByZero:YES];
{
NSString *subtractStr = @"1.0";
NSString *oneStr = @"1.114";
NSString *twoStr = @"1.116";
NSDecimalNumber *oneNum = [NSDecimalNumber decimalNumberWithString:oneStr];
NSDecimalNumber *twoNum = [NSDecimalNumber decimalNumberWithString:twoStr];
NSDecimalNumber *subtractNum = [NSDecimalNumber decimalNumberWithString:subtractStr];
// 減法
oneNum = [oneNum decimalNumberBySubtracting:subtractNum withBehavior:roundDown];
twoNum = [twoNum decimalNumberBySubtracting:subtractNum withBehavior:roundDown];
NSLog(@"\n1.114 - 1.0 (保留兩位小數(shù))向下取整的結(jié)果為:%@\n1.116 - 1.0 (保留兩位小數(shù))向下取整的結(jié)果為:%@", oneNum, twoNum);
}
三:向上取整
// 向上取整
NSDecimalNumberHandler *roundUp = [NSDecimalNumberHandler decimalNumberHandlerWithRoundingMode:NSRoundUp scale:2 raiseOnExactness:NO raiseOnOverflow:NO raiseOnUnderflow:NO raiseOnDivideByZero:YES];
{
NSString *multiplyStr = @"1.0";
NSString *oneStr = @"1.114";
NSString *twoStr = @"1.116";
NSDecimalNumber *oneNum = [NSDecimalNumber decimalNumberWithString:oneStr];
NSDecimalNumber *twoNum = [NSDecimalNumber decimalNumberWithString:twoStr];
NSDecimalNumber *multiplyNum = [NSDecimalNumber decimalNumberWithString:multiplyStr];
// 乘法
oneNum = [oneNum decimalNumberByMultiplyingBy:multiplyNum withBehavior:roundUp];
twoNum = [twoNum decimalNumberByMultiplyingBy:multiplyNum withBehavior:roundUp];
NSLog(@"\n1.114 * 1.0 (保留兩位小數(shù))向上取整的結(jié)果為:%@\n1.116 * 1.0 (保留兩位小數(shù))向上取整的結(jié)果為:%@", oneNum, twoNum);
}
四:NSRoundBankers
// 在四舍五入的基礎(chǔ)上灿渴,加上末尾數(shù)為5時(shí)洛波,變成偶數(shù)的規(guī)則,例如小數(shù)點(diǎn)后兩位骚露, 1.215 時(shí)變?yōu)?1.22, 1.225 時(shí)變?yōu)?1.22
NSDecimalNumberHandler *roundBankers = [NSDecimalNumberHandler decimalNumberHandlerWithRoundingMode:NSRoundBankers scale:2 raiseOnExactness:NO raiseOnOverflow:NO raiseOnUnderflow:NO raiseOnDivideByZero:YES];
{
NSString *dividStr = @"1.0";
NSString *oneStr = @"1.115";
NSString *twoStr = @"1.125";
NSDecimalNumber *oneNum = [NSDecimalNumber decimalNumberWithString:oneStr];
NSDecimalNumber *twoNum = [NSDecimalNumber decimalNumberWithString:twoStr];
NSDecimalNumber *dividNum = [NSDecimalNumber decimalNumberWithString:dividStr];
// 除法
oneNum = [oneNum decimalNumberByDividingBy:dividNum withBehavior:roundBankers];
twoNum = [twoNum decimalNumberByDividingBy:dividNum withBehavior:roundBankers];
NSLog(@"\n1.115 / 1.0 (保留兩位小數(shù))NSRoundBankers的結(jié)果為:%@\n1.125 / 1.0 (保留兩位小數(shù))NSRoundBankers的結(jié)果為:%@", oneNum, twoNum);
}