Objective-CFloat转化成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
优质内容筛选与推荐>>
1、7月29日实习日志
2、Docker连接General Version Control System(Gitlab/Github)自动build
3、极其蛋疼的if else 中的break用法
4、javaWEB知识总结——Filter(过滤器)
5、我的第一个正式react demo


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号