美文网首页iOS开发笔记
iOS高精度数值计算

iOS高精度数值计算

作者: 简洁的想法 | 来源:发表于2017-01-11 11:52 被阅读616次

对于电商或者金融类app,使用float、double来计算价格数值可能是达不到要求的。使用apple官方API:NSDecimalNumber可能是更好的选择。

  • 初始化

- (instancetype)initWithMantissa:(unsigned long long)mantissa exponent:(short)exponent isNegative:(BOOL)flag;
- (instancetype)initWithDecimal:(NSDecimal)dcm;
- (instancetype)initWithString:(nullable NSString *)numberValue;
- (instancetype)initWithString:(nullable NSString *)numberValue locale:(nullable id)locale;


实例:
//mantissa:长整形;exponent:指数;flag:正负数          
NSDecimalNumber * amount0 = [[NSDecimalNumber alloc] initWithMantissa:42 exponent:-2 isNegative:NO];//0.42  
NSDecimalNumber * amount1 = [[NSDecimalNumber alloc] initWithMantissa:42 exponent:2 isNegative:NO];//-4200 

//locale代表一种格式,对于这种格式可以参考一下例子去理解  
NSDictionary *locale0 = [NSDictionary dictionaryWithObject:@"," forKey:NSLocaleDecimalSeparator];    //以","当做小数点格式  
NSDecimalNumber * amount2 = [[NSDecimalNumber alloc] initWithString:@"42,68" locale:locale0];//42.68  
NSLocale *locale5 = [[NSLocale alloc] initWithLocaleIdentifier:@"fr_FR"];//法国数据格式,法国的小数点是','逗号  
NSDecimalNumber * amount3 = [[NSDecimalNumber alloc] initWithString:@"42.68" locale:locale5];//42.68  
  • 基本的算术方法
加法
- (NSDecimalNumber *)decimalNumberByAdding:(NSDecimalNumber *)decimalNumber;
减法
- (NSDecimalNumber *)decimalNumberBySubtracting:(NSDecimalNumber *)decimalNumber;
乘法
- (NSDecimalNumber *)decimalNumberByMultiplyingBy:(NSDecimalNumber *)decimalNumber;
除法
- (NSDecimalNumber *)decimalNumberByDividingBy:(NSDecimalNumber *)decimalNumber;
幂次方
- (NSDecimalNumber *)decimalNumberByRaisingToPower:(NSUInteger)power;
指数
- (NSDecimalNumber *)decimalNumberByMultiplyingByPowerOf10:(short)power;

  • 四舍五入运算
- (NSDecimalNumber *)decimalNumberByRoundingAccordingToBehavior:(nullable id <NSDecimalNumberBehaviors>)behavior;

+ (instancetype)decimalNumberHandlerWithRoundingMode:(NSRoundingMode)roundingMode scale:(short)scale raiseOnExactness:(BOOL)exact raiseOnOverflow:(BOOL)overflow raiseOnUnderflow:(BOOL)underflow raiseOnDivideByZero:(BOOL)divideByZero;


实例:
// 四舍五入策略 :
// Original
//    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
roundingMode 要使用的舍入模式,有四种值: NSRoundUp, NSRoundDown, NSRoundPlain, and NSRoundBankers
scale 结果保留几位小数
aiseOnExactness 发生精确错误时是否抛出异常,一般为NO
raiseOnOverflow 发生溢出错误时是否抛出异常,一般为NO
raiseOnUnderflow 发生不足错误时是否抛出异常,一般为NO
raiseOnDivideByZero 被0除时是否抛出异常,一般为YES

NSDecimalNumberHandler * rounUp = [NSDecimalNumberHandler decimalNumberHandlerWithRoundingMode:NSRoundDown scale:1 raiseOnExactness:NO raiseOnOverflow:NO raiseOnUnderflow:NO raiseOnDivideByZero:YES];  
NSDecimalNumber *subtotalAmount = [NSDecimalNumber decimalNumberWithMantissa:4284 exponent:-2 isNegative:NO];  
NSDecimalNumber * roundUpAmount = [subtotalAmount decimalNumberByRoundingAccordingToBehavior:rounUp]; 
  • 比较运算

- (NSComparisonResult)compare:(NSNumber *)decimalNumber;

NSDecimalNumber *count0 = [NSDecimalNumber decimalNumberWithString:@"41"];  
NSDecimalNumber *count1 = [NSDecimalNumber decimalNumberWithString:@"43"];  
NSComparisonResult result = [count0 compare:count1]; 
// 上升 = NSOrderedAscending  1、2、3、。。。。。
if (result == NSOrderedAscending) {  
      //41 < 43  
} else if (result == NSOrderedSame) {  
      //41 == 43  
} else if (result == NSOrderedDescending) {  
      //41 > 43  
}  


参考
iOS开发中高精度数值(货币)计算

相关文章

  • iOS高精度数值计算

    对于电商或者金融类app,使用float、double来计算价格数值可能是达不到要求的。使用apple官方API:...

  • iOS中的高精度数值计算

    前言 在iOS开发中,和价格计算相关的,需要注意计算精度的问题,使用float、double来计算价格数值会出现精...

  • 利用scipy数值微分与数值积分

    SciPy是Python的一个强大的科学计算工具库,而高精度的数值微分与数值积分又是科学计算中重要的成分。尽管我们...

  • 《Java编程思想》笔记——基础知识

    1.基本类型 高精度数值类型: BigInteger和BigDecimal是java中的高精度数值类型,由于它们是...

  • 大数运算加减乘除

    大数是啥?来一段百度百科的话由于编程语言提供的基本数值数据类型表示的数值范围有限,不能满足较大规模的高精度数值计算...

  • Java大数类BigDecimal及八种舍入模式的介绍

    BigDecimal的引入 在利用Java编程语言开发银行、金融类等需要对数值进行高精度计算的软件时,我们经常使用...

  • 0.1+0.2不等于0.3

    浮点数值的最高精度是 17 位小数,但在进行算术计算时其精确度远远不如整数。例如,0.1 加 0.2 的结果不是 ...

  • sicily_1029 Rabbit

    标签: sicily 高精度计算 题目链接: http://soj.sysu.edu.cn/1029 思路 高精度...

  • 源铸:数值处理问题

    一、数值存储计算方案 高精度浮点数 采用双精度浮点数是最简单的存储方案,数据库支持,编程语言也支持。只要数据库和编...

  • 高精度计算

    1.大整数加法:开两队数组,输入为字符串,然后要转换成int数组。最先输入的是char[0]的位置,然而这个应该是...

网友评论

    本文标题:iOS高精度数值计算

    本文链接:https://www.haomeiwen.com/subject/kxxrbttx.html