iOS 笔记 精确计算 NSDecimalNumber
2016-07-12 16:28
501 查看
今天因为出现了 str 转float 的误差问题, 接触到了NSDecimalNumber这个类, 在别人那里找来了一些现成的笔记, 记录一下
/**由于NSDecimalNumber能够存储很大的值(大到38位 x
10^+/-128)。这样进行一些大数值运算时也很方便,但是直接使用C的标量值会比通过NSDecimalNumber更快,所以需要慎重选择该方法。通常来说,这只在集合中使用。
*/
//NSDecimalNumber常见用法
//1.小数位处理及约数方式
NSDecimalNumberHandler * roundUp = [NSDecimalNumberHandlerdecimalNumberHandlerWithRoundingMode:NSRoundBankersscale:2raiseOnExactness:NOraiseOnOverflow:NOraiseOnUnderflow:NOraiseOnDivideByZero:YES]; //保留两位小数(scale)
/** RoundingMode:NSRoundPlain //貌似取整
NSRoundDown, // Always down == truncate //只舍不入
NSRoundUp, // Always up // 只入不舍
NSRoundBankers // on a tie round so last digit is even //貌似四舍五入
**/
NSDecimalNumber *subtotal = [NSDecimalNumberdecimalNumberWithString:@"90.7049"];
NSDecimalNumber *discount = [NSDecimalNumberdecimalNumberWithString:@"0.22"];
NSDecimalNumber *total = [subtotaldecimalNumberByAdding:discount withBehavior:roundUp];
//按照roundUp规定好的进行相加:四舍五入、保留两位小数
NSLog(@"Rounded total: %@", total);
//2.次方计算
NSDecimalNumber*price;
price = [NSDecimalNumberdecimalNumberWithMantissa:1599exponent:-2 //10的-2次方
isNegative:NO];
//等效于
price = [NSDecimalNumberdecimalNumberWithString:@"15.99"];
//3.加减乘除四则运算
NSDecimalNumber*price1 = [NSDecimalNumberdecimalNumberWithString:@"15.99"];
NSDecimalNumber*price2 = [NSDecimalNumberdecimalNumberWithString:@"29.99"];
NSDecimalNumber*coupon = [NSDecimalNumberdecimalNumberWithString:@"5.00"];
NSDecimalNumber*disCount = [NSDecimalNumberdecimalNumberWithString:@".90"];
NSDecimalNumber*numProducts = [NSDecimalNumberdecimalNumberWithString:@"2.0"];
NSDecimalNumber *subTotal = [price1decimalNumberByAdding:price2];//相加
NSDecimalNumber *afterCoupon = [subtotaldecimalNumberBySubtracting:coupon];//相减
NSDecimalNumber *afterDiscount = [afterCoupondecimalNumberByMultiplyingBy:disCount];//相乘
//按照roundUp规定好的进行相乘:四舍五入、保留两位小数
NSDecimalNumber*total2 = [subtotaldecimalNumberByMultiplyingBy:discountwithBehavior:roundUp];
NSDecimalNumber *average = [afterDiscountdecimalNumberByDividingBy:numProducts];//相除
NSDecimalNumber*averageSquared = [averagedecimalNumberByRaisingToPower:2];//平方
//4.比较大小
NSDecimalNumber*discount1 = [NSDecimalNumberdecimalNumberWithString:@".85"];
NSDecimalNumber*discount2 = [NSDecimalNumberdecimalNumberWithString:@".9"];
NSComparisonResult result = [discount1compare:discount2];
if (result ==NSOrderedAscending) {
NSLog(@"85%% < 90%%小于");
} elseif (result == NSOrderedSame)
{
NSLog(@"85%% == 90%%等于");
} elseif (result == NSOrderedDescending)
{
NSLog(@"85%% > 90%%大于");
}
/**由于NSDecimalNumber能够存储很大的值(大到38位 x
10^+/-128)。这样进行一些大数值运算时也很方便,但是直接使用C的标量值会比通过NSDecimalNumber更快,所以需要慎重选择该方法。通常来说,这只在集合中使用。
*/
//NSDecimalNumber常见用法
//1.小数位处理及约数方式
NSDecimalNumberHandler * roundUp = [NSDecimalNumberHandlerdecimalNumberHandlerWithRoundingMode:NSRoundBankersscale:2raiseOnExactness:NOraiseOnOverflow:NOraiseOnUnderflow:NOraiseOnDivideByZero:YES]; //保留两位小数(scale)
/** RoundingMode:NSRoundPlain //貌似取整
NSRoundDown, // Always down == truncate //只舍不入
NSRoundUp, // Always up // 只入不舍
NSRoundBankers // on a tie round so last digit is even //貌似四舍五入
**/
NSDecimalNumber *subtotal = [NSDecimalNumberdecimalNumberWithString:@"90.7049"];
NSDecimalNumber *discount = [NSDecimalNumberdecimalNumberWithString:@"0.22"];
NSDecimalNumber *total = [subtotaldecimalNumberByAdding:discount withBehavior:roundUp];
//按照roundUp规定好的进行相加:四舍五入、保留两位小数
NSLog(@"Rounded total: %@", total);
//2.次方计算
NSDecimalNumber*price;
price = [NSDecimalNumberdecimalNumberWithMantissa:1599exponent:-2 //10的-2次方
isNegative:NO];
//等效于
price = [NSDecimalNumberdecimalNumberWithString:@"15.99"];
//3.加减乘除四则运算
NSDecimalNumber*price1 = [NSDecimalNumberdecimalNumberWithString:@"15.99"];
NSDecimalNumber*price2 = [NSDecimalNumberdecimalNumberWithString:@"29.99"];
NSDecimalNumber*coupon = [NSDecimalNumberdecimalNumberWithString:@"5.00"];
NSDecimalNumber*disCount = [NSDecimalNumberdecimalNumberWithString:@".90"];
NSDecimalNumber*numProducts = [NSDecimalNumberdecimalNumberWithString:@"2.0"];
NSDecimalNumber *subTotal = [price1decimalNumberByAdding:price2];//相加
NSDecimalNumber *afterCoupon = [subtotaldecimalNumberBySubtracting:coupon];//相减
NSDecimalNumber *afterDiscount = [afterCoupondecimalNumberByMultiplyingBy:disCount];//相乘
//按照roundUp规定好的进行相乘:四舍五入、保留两位小数
NSDecimalNumber*total2 = [subtotaldecimalNumberByMultiplyingBy:discountwithBehavior:roundUp];
NSDecimalNumber *average = [afterDiscountdecimalNumberByDividingBy:numProducts];//相除
NSDecimalNumber*averageSquared = [averagedecimalNumberByRaisingToPower:2];//平方
//4.比较大小
NSDecimalNumber*discount1 = [NSDecimalNumberdecimalNumberWithString:@".85"];
NSDecimalNumber*discount2 = [NSDecimalNumberdecimalNumberWithString:@".9"];
NSComparisonResult result = [discount1compare:discount2];
if (result ==NSOrderedAscending) {
NSLog(@"85%% < 90%%小于");
} elseif (result == NSOrderedSame)
{
NSLog(@"85%% == 90%%等于");
} elseif (result == NSOrderedDescending)
{
NSLog(@"85%% > 90%%大于");
}
相关文章推荐
- [iOS item-services分发] 企业级账户分发-个人练手记录
- 升级OS X 10.11后CocoaPods的安装(问题与解决方法)
- Block的使用
- iOS常用的线程锁
- iOS判断某个类是否释放
- nagios监控流量
- iOS Run loop使用实例
- iOS之label行间距的缩进
- 安装CocoaPods报错解决方案 & 降低CocoaPods版本 & 切换CocoaPods版本
- iOS开发,获取动态web页面的高度
- iOS 上传数据到后台
- [个人收藏]iOS HOOK 注入与重签名
- ios 屏幕旋转,横屏竖屏
- IOS 正则验证
- 获取iOS设备当前运行的进程
- iOS原生录音功能
- iOS压缩图片大小
- -force_load配置framework路径
- iOS动画(Core Animation)使用
- ios开发原生的扫描二维码的实现以及限制扫描区域rectOfInterest遇到的一些坑