NSDecimalNumber

继承NSNumber,用来处理精准计算。
之前的一个电商项目中,就经常会遇到这样一个问题。
使用自带解析 [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableLeaves error:nil];出现以下问题:
解析前:"71.40"
解析后:"71.40000000000001"
当时使用了第三方才处理了这个问题。
今天偶然间看了一篇博客: http://blog.csdn.net/jq2530469200/article/details/52061970

//string转NSDecimalNumber
+ (NSDecimalNumber *)decimalNumberWithString:(nullable NSString *)numberValue;
/*例:将一个double类型变量转换为string类型*/
- (NSString *)decimalNumberWithDouble:(double)value
{
NSString *doubleString = [NSString stringWithFormat:@"%f", value];
NSDecimalNumber *decNumber = [NSDecimalNumber decimalNumberWithString:doubleString];
return [decNumber stringValue];
}

//带有NSDecimalNumberHandler的舍入运算
- (NSDecimalNumber *)decimalNumberByRoundingAccordingToBehavior:(nullable id <NSDecimalNumberBehaviors>)behavior;

NSDecimalNumberHandler:NSDecimalNumber的公共协议处理类
/**
初始化方法
roundingMode 舍入方式
typedef NS_ENUM(NSUInteger, NSRoundingMode) {
NSRoundPlain, // 四舍五入
NSRoundDown, //向下取舍
NSRoundUp, // 向上取舍
NSRoundBankers
};
scale 小数点后位数
exact 精度错误处理
overflow 溢出错误处理
underflow 下溢错误处理
divideByZero 除以0的错误处理
*/
+ (instancetype)decimalNumberHandlerWithRoundingMode:(NSRoundingMode)roundingMode scale:(short)scale raiseOnExactness:(BOOL)exact raiseOnOverflow:(BOOL)overflow raiseOnUnderflow:(BOOL)underflow raiseOnDivideByZero:(BOOL)divideByZero

//精确计算相加
- (NSDecimalNumber *)decimalNumberByAdding:(NSDecimalNumber *)decimalNumber;
//传入NSDecimalNumberHandler对象的相加计算
- (NSDecimalNumber *)decimalNumberByAdding:(NSDecimalNumber *)decimalNumber withBehavior:(nullable id <NSDecimalNumberBehaviors>)behavior;
//减
- (NSDecimalNumber *)decimalNumberBySubtracting:(NSDecimalNumber *)decimalNumber;
- (NSDecimalNumber *)decimalNumberBySubtracting:(NSDecimalNumber *)decimalNumber withBehavior:(nullable id <NSDecimalNumberBehaviors>)behavior;
//乘
- (NSDecimalNumber *)decimalNumberByMultiplyingBy:(NSDecimalNumber *)decimalNumber;
- (NSDecimalNumber *)decimalNumberByMultiplyingBy:(NSDecimalNumber *)decimalNumber withBehavior:(nullable id <NSDecimalNumberBehaviors>)behavior;
//除
- (NSDecimalNumber *)decimalNumberByDividingBy:(NSDecimalNumber *)decimalNumber;
- (NSDecimalNumber *)decimalNumberByDividingBy:(NSDecimalNumber *)decimalNumber withBehavior:(nullable id <NSDecimalNumberBehaviors>)behavior;
//以power为底的次方运算
- (NSDecimalNumber *)decimalNumberByRaisingToPower:(NSUInteger)power;
- (NSDecimalNumber *)decimalNumberByRaisingToPower:(NSUInteger)power withBehavior:(nullable id <NSDecimalNumberBehaviors>)behavior;
//10为底的乘方
- (NSDecimalNumber *)decimalNumberByMultiplyingByPowerOf10:(short)power;
- (NSDecimalNumber *)decimalNumberByMultiplyingByPowerOf10:(short)power withBehavior:(nullable id <NSDecimalNumberBehaviors>)behavior;

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • NSDecimalNumber是NSNumber的子类,比NSNumber的功能更为强大,可以指定一个数的幂,四舍...
    博尔茨杰阅读 1,931评论 0 1
  • NSDecimalNumber是NSNumber的不可变子类。苹果针对浮点型计算时存在精度计算误差的问题而提供的一...
    小孩仔阅读 6,924评论 0 1
  • 在iOS开发中,和货币价格计算相关的,需要注意计算精度的问题。即使只是两位小数,也会出现误差。使用float类型运...
    海边的遐想阅读 5,359评论 0 23
  • 前言 在日常的开发中我们随时都会跟数字打着交道,对数字的处理也是很平常的事,本文仅对常用的数字操作一个小结,当一个...
    進无尽阅读 1,187评论 0 2
  • 1.现象: 因APP业务需要,从后台端取得轨迹点的string,包含一千及以上个经纬度坐标点,数值精度为小数点后六...
    Masazumi柒阅读 2,328评论 0 0