首先我抛出一个例子代码如下
所以在进行金额计算时尽量避免使用 float或 double,若要使用一定要精确计算
NSString *str = @"555448.96";
float vlue = str.floatValue;
double vlue2 = str.doubleValue;
NSString *rmb = [NSString stringWithFormat:@"%.2f",vlue];
NSString *rmbeee = [NSString stringWithFormat:@"%.2f",vlue2];
NSString *rmb1 = [NSString stringWithFormat:@"%.2f",0.123];
NSString *rmb2 = [NSString stringWithFormat:@"%.2f",0.124];
NSString *rmb3 = [NSString stringWithFormat:@"%.2f",0.1251];
NSString *rmb4 = [NSString stringWithFormat:@"%.2f",0.126];
NSString *rmb5 = [NSString stringWithFormat:@"%.2f",0.127];
结果
我们发现vlue的精度不够,如果用于银行结算会出大问题,同样float和double都是不能使用的
在OC中对于高精度的计算我们有三种方法
- 使用float或double在输出时进行舍入
- 使用long或int定制小数点以及输出转换
- 使用系统提供的建议类型NSDecimalNumber
NSDecimalNumber的使用方法有
//由字符串进行初始化
NSDecimalNumber * a = [NSDecimalNumber decimalNumberWithString:@"555448.96"];
// 由unsigned long long类型进行初始化,exponent为位数,isNegative为是否为负数.
NSDecimalNumber* b= [NSDecimalNumber decimalNumberWithMantissa:234445460 exponent:-4 isNegative:NO];
//加减乘除操作:
a = [a decimalNumberByAdding:b];
a = [a decimalNumberBySubtracting:b];//减为 a-b
a = [a decimalNumberByMultiplyingBy:b];
a = [a decimalNumberByDividingBy:b];//除为 a / b
// n次 幂操作
a = [a decimalNumberByRaisingToPower:2];
//比较操作,返回一个NSComparisonResult类型的枚举,即以-1为小于,1为大于,0为相等.
typedef NS_ENUM(NSInteger, NSComparisonResult) {NSOrderedAscending = -1, NSOrderedSame, NSOrderedDescending}result;
NSLog(@"%ld",(long)[a compare:b]);
[a compare:b]; //进行比较.需要注意的是,compare函数的参数是 NSNumber,所以,要比较其他数值也就比较简单,如要与基础类型进行比较:
[a compare: @1];//NSNumber可以用@进行初始化.
所以在进行金额计算时尽量避免使用 float或 double,若要使用一定要精确计算