后台返回97.70,若使用float类型接收时,就会发现数据精度发生了改变,iOS客户端收到了“97.6999999...”,解决办法:使用NSString类型接收
使用float类型进行四则计算时,也会出现类似问题,解决方法是:所有参与运算的数据均使用NSString类型,并且在对其进行计算的时候使用NSDecimalNumber
- 加法
NSString *decimalNumbeAdding(NSString *value1, NSString *value2)
{
NSDecimalNumber *multiplierNumber = [NSDecimalNumber decimalNumberWithString:[NSString stringWithFormat:@"%@", value1]];
NSDecimalNumber *multiplicandNumber = [NSDecimalNumber decimalNumberWithString:[NSString stringWithFormat:@"%@", value2]];
NSDecimalNumber *product = [multiplierNumber decimalNumberByAdding:multiplicandNumber];
return [product stringValue];
}
- 减法
NSString *decimalNumbeSubtracting(NSString *value1,NSString *value2)
{
NSDecimalNumber *multiplierNumber = [NSDecimalNumber decimalNumberWithString:[NSString stringWithFormat:@"%@", value1]];
NSDecimalNumber *multiplicandNumber = [NSDecimalNumber decimalNumberWithString:[NSString stringWithFormat:@"%@", value2]];
NSDecimalNumber *product = [multiplierNumber decimalNumberBySubtracting:multiplicandNumber];
return [product stringValue];
}
- 乘法
NSString *decimalNumberMutiply(NSString *value1,NSString *value2)
{
NSDecimalNumber *multiplierNumber = [NSDecimalNumber decimalNumberWithString:[NSString stringWithFormat:@"%@", value1]];
NSDecimalNumber *multiplicandNumber = [NSDecimalNumber decimalNumberWithString:[NSString stringWithFormat:@"%@", value2]];
NSDecimalNumber *product = [multiplierNumber decimalNumberByMultiplyingBy:multiplicandNumber];
return [product stringValue];
}
- 除法
NSString *decimalNumberDividing(NSString *value1,NSString *value2)
{
if(StrIsEmpty(value1) || StrIsEmpty(value2) || [value1 floatValue] == 0.00f || [value2 floatValue] == 0.00f){
return @"0.00";
}
NSDecimalNumber *multiplierNumber = [NSDecimalNumber decimalNumberWithString:[NSString stringWithFormat:@"%@", value1]];
NSDecimalNumber *multiplicandNumber = [NSDecimalNumber decimalNumberWithString:[NSString stringWithFormat:@"%@", value2]];
NSDecimalNumber *product = [multiplierNumber decimalNumberByDividingBy:multiplicandNumber];
return [product stringValue];
}
使用示例
//金额 = 数量 * 单价
NSString *amount = decimalNumberMutiply(quantity, price);
注意:算出的结果并不会自动保留两位小数,如99.99 * 99.99 = 9998.0001,如需保留两位小数可以使用NSDecimalNumberHandler
/**
初始化方法
@param roundingMode 舍入方式
@param scale 小数点后舍入值的位数。
@param exact 精度错误处理;YES:如果出现错误,将引发异常,NO:忽略错误并将控制权放回给调用者。
@param overflow 溢出错误处理;YES:如果出现错误,将引发异常,NO:忽略错误并将控制权放回给调用者。
@param underflow 下溢错误处理;YES:如果出现错误,将引发异常,NO:忽略错误并将控制权放回给调用者。
@param divideByZero 除以0的错误处理;YES:如果出现错误,将引发异常,NO:忽略错误并将控制权放回给调用者。
@return NSDecimalNumberHandler对象
*/
+ (instancetype)decimalNumberHandlerWithRoundingMode:(NSRoundingMode)roundingMode
scale:(short)scale
raiseOnExactness:(BOOL)exact
raiseOnOverflow:(BOOL)overflow
raiseOnUnderflow:(BOOL)underflow
raiseOnDivideByZero:(BOOL)divideByZero
网友评论