63.保留小数位数和精确数字(NSDecimalNumber/NSDecimalNumberHandler)
2016-03-25 16:34
567 查看
大家都会在开发中遇到, 一个 float或者 double 类型的小数上, 有时候会有一个精度的丢失, 造成数据不准确. 尤其是在涉及到一些支付的项目, 都要求比较精确, 所以来说一说NSDecimalNumber, 顺便说一下保留小数的方法,NSDecimalNumberHandler 和 Xcode 自带宏定义中的 round().
打印结果: 0–1–1.00001–0.99999–2–0.99999–0.9999999999–1.00001
打印结果: 0.13
scale: 小数点后保留的位数
RoundingMode: 小数保留的类型
根据官方文档说明, 枚举值分析:
NSRoundPlain, 四舍五入
NSRoundDown, 只舍不入
NSRoundUp, 只入不舍
NSRoundBankers 四舍六入, 中间值时, 取最近的,保持保留最后一位为偶数
参照一下图片, 理解上面枚举值:
![](http://img.blog.csdn.net/20160325162625262)
打印结果: 12.000000—1234.570000
NSDecimalNumber
//部分创建方法 [[NSDecimalNumber alloc]initWithFloat:2.2]; [[NSDecimalNumber alloc]initWithInt:2]; [[NSDecimalNumber alloc]initWithInteger:2]; [[NSDecimalNumber alloc]initWithBool:0]; NSDecimalNumber *zeroDN = [NSDecimalNumber zero]; NSDecimalNumber *oneDN = [NSDecimalNumber one]; NSDecimalNumber *aDN = [NSDecimalNumber decimalNumberWithString:@"1.00001"]; NSDecimalNumber *bDN = [NSDecimalNumber decimalNumberWithString:@"0.99999"]; NSDecimalNumber *cDN = [aDN decimalNumberByAdding:bDN]; NSDecimalNumber *dDN = [cDN decimalNumberBySubtracting:aDN]; NSDecimalNumber *eDN = [dDN decimalNumberByMultiplyingBy:aDN]; NSDecimalNumber *fDN = [eDN decimalNumberByDividingBy:bDN];//除数为0会 crash NSLog(@"%@--%@--%@--%@--%@--%@--%@--%@",zeroDN,oneDN,aDN,bDN,cDN,dDN,eDN,fDN);
打印结果: 0–1–1.00001–0.99999–2–0.99999–0.9999999999–1.00001
保留小数位数
NSDecimalNumberHandler
NSDecimalNumberHandler *roundingBehavior = [NSDecimalNumberHandler decimalNumberHandlerWithRoundingMode:NSRoundPlain scale:2 raiseOnExactness:NO raiseOnOverflow:NO raiseOnUnderflow:NO raiseOnDivideByZero:NO]; NSDecimalNumber *aDN = [[NSDecimalNumber alloc] initWithFloat:0.125532]; NSDecimalNumber *resultDN = [aDN decimalNumberByRoundingAccordingToBehavior:roundingBehavior]; NSLog(@"%@", resultDN);
打印结果: 0.13
scale: 小数点后保留的位数
RoundingMode: 小数保留的类型
根据官方文档说明, 枚举值分析:
NSRoundPlain, 四舍五入
NSRoundDown, 只舍不入
NSRoundUp, 只入不舍
NSRoundBankers 四舍六入, 中间值时, 取最近的,保持保留最后一位为偶数
参照一下图片, 理解上面枚举值:
round
关于保留小数位数在Xcode 的 math.h 中有自带的宏定义:double a = round(12.345); double b = round(1234.5678 * 100) / 100; NSLog(@"%lf---%lf",a,b);
打印结果: 12.000000—1234.570000
相关文章推荐
- jQuery操作HTM元素的常见事件
- SetWindowLong 用法总结
- 利用webstrom的宏,保存文件自动格式化代码
- 四大组件之ContentProvider
- react-native开源组件react-native-wechat学习
- 《内核设计与实现》第十八章读书笔记
- bzoj2467 生成树 Matrix-tree定理
- MapReduce-Counter使用-快速实现大文件行数的统计
- Nginx+tomcat 实现负载均衡和动静分离
- MIPS cache指令
- hjr-四旋翼飞行器串级PID飞控算法
- C#——Random类猜数字
- Linux系统iNode耗尽硬盘无法写入文件怎么办?
- GetMemory的几个笔试题 面试碰到两次
- Obj-C语言开发iOS项目使用反射减少代码工作 (转载他人)
- BouncyCastle not registered
- 最长公共子子串 java
- [转]SpringMVC日期类型转换问题三大处理方法归纳
- JAVA基础--继承和权限控制
- mysql各种引擎的比较