iOS 金钱货币的计算问题

ios开发中涉及到和货币价格计算相关的,都需要注意计算精度的问题。
服务器有可能返回的金钱是int float double string NSNumber, 单纯的float、double的计算都会出现精度问题,即使只是两位小数,也会出现误差。
苹果为我们提供了NSDecimalNumber的API来处理金钱的计算的问题:
​ 1、字符串转float等不精确问题。
​ 2、精确计算
​ 3、保留小数位数
​ 4、四舍五入及其它的保留小数位数规则

直接上代码(已封装)

.h

1
2
3
4
5
6
7
8
9
10
11
12
13
#import <Foundation/Foundation.h>
// 金额计算方式
typedef enum {
Adding,
Subtracting,
Multiplying,
Dividing,
}calucateWay;
@interface DecimalCalucateTool : NSObject
+ (NSString *)decimalNumberCalucate:(NSString *)originValue1 originValue2:(NSString *)originValue2 calucateWay:(calucateWay)calucateWay;
@end

.m

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#import "DecimalCalucateTool.h"
@implementation DecimalCalucateTool
#pragma mark 货币计算
+ (NSString *)decimalNumberCalucate:(NSString *)originValue1 originValue2:(NSString *)originValue2 calucateWay:(calucateWay)calucateWay
{
NSDecimalNumber *decimalNumber1 = [NSDecimalNumber decimalNumberWithString:originValue1];
NSDecimalNumber *decimalNumber2 = [NSDecimalNumber decimalNumberWithString:originValue2];
NSDecimalNumber *product;
switch (calucateWay) {
case Adding:
NSLog(@"+++++++++");
product = [decimalNumber1 decimalNumberByAdding:decimalNumber2];
break;
case Subtracting:
NSLog(@"---------");
product = [decimalNumber1 decimalNumberBySubtracting:decimalNumber2];
break;
case Multiplying:
NSLog(@"*********");
product = [decimalNumber1 decimalNumberByMultiplyingBy:decimalNumber2];
break;
case Dividing:
NSLog(@"/////////");
product = [decimalNumber1 decimalNumberByDividingBy:decimalNumber2];
break;
default:
break;
}
return [product stringValue];
}
@end