Objective-C Float 转化成NSString 小数不精确解决

在开发中经常会遇到Float类型转化成NSString类型后不准确的问题

float a = 0.96;
NSString *str = [NSString stringWithFormat:@"%.1f",a];
NSLog(@"%@",str);

打印

2018-05-25 16:24:14.457366+0800 Test[19641:4237944] 1.0

我们想要的是输出0.9

这种问题怎么处理
可以写一个NSString的Category来处理

#import "NSString+Precision.h"

@implementation NSString (Precision)

/**
 Float 类型转化成字符串获取小数点后N位
 
 @param value 需要转化的Value
 @param position 小数点后几位
 @return 转化后的字符串
 */
+ (NSString *)decimalNumberWithFloat:(float)value position:(int)position
{
    NSString *doubleString        = [NSString stringWithFormat:@"%lf", value];
    NSDecimalNumber *decNumber    = [NSDecimalNumber decimalNumberWithString:doubleString];
    NSString *decStr = [decNumber stringValue];
    
    // 获取"."所在字符串中的Range
    NSRange range = [decStr rangeOfString:@"."];
    // 处理整型没有小数点的情况(小数点后加两个0,方便转化成金额)
    if (range.length == 0) {
        decStr = [NSString stringWithFormat:@"%@.00",decStr];
    }
    
    range = [decStr rangeOfString:@"."];
    // 最大截取范围
    NSInteger maxCutRange = decStr.length - range.location - 1;
    // 是否超出了最大截取范围
    if (position <= maxCutRange) {
        decStr = [decStr substringWithRange:NSMakeRange(0, range.length + position + range.location)];
    }
    else{
        // 超出范围按最大来
        decStr = [decStr substringWithRange:NSMakeRange(0, range.length + maxCutRange + range.location)];
    }
    
    return decStr;
}

@end
NSLog(@"-----------%@",[self decimalNumberWithFloat:0.96 position:1]);

输出
2018-05-25 16:27:53.547775+0800 DD[19782:4242695] -----------0.9

你可能感兴趣的:(Objective-C Float 转化成NSString 小数不精确解决)