iphone - ObjC 将 Float 的小数位格式化为字符串

标签 iphone objective-c string floating-point

如何将 float 格式化为字符串,以便如果用户输入具有 2 位或更少小数位的数字,则将其格式化为具有 2 位小数,但如果用户输入具有 2 位或更多小数位的 float 然后显示所有小数位。例如

4.1 => 4.10
1 => 1.00
1.358484 => 1.358484

因此,如果需要的话,格式设置为小数点后两位或更多。

希望我说得有道理。

最佳答案

尝试这样的事情。

BOOL requiresExtraPrecision (double num) {
    double roundedToHundredth = round(num * 100.0) / 100.0;
    double diff = num - roundedToHundredth;
    if (diff < 0) diff = 0.0 - diff;
    if (diff < 0.0000001) {
        return NO;
    } else {
        return YES;
    }
}

NSString *formatted (double num) {
    if (requiresExtraPrecision(num)) {
        return [NSString stringWithFormat:@"%F", num];
    } else {
        NSNumberFormatter *formatter = [[[NSNumberFormatter alloc] init] autorelease];
        [formatter setMaximumFractionDigits:2];
        [formatter setMinimumFractionDigits:2];
        return [formatter stringFromNumber:[NSNumber numberWithDouble:num]];
    }
}

正如@Carl 在对该问题的评论中所写,困难的部分是决定 double 值何时需要其所有精度。在这段代码中,我假设如果 double “足够接近”四舍五入的数字(百万分之一以内),那么我们应该只显示四舍五入的数字。

您可能决定使其更严格(十亿分之一?),但您总是必须使用某种近似值,因为某些小数无法精确地存储为 float 。即使用户可能在输入时键入了“0.1”,当该数字存储为 float 时,该信息也会丢失。

因此,鉴于您将拥有一个非常接近小数但又不完全正确的 float ,您必须决定何时认为该 float “足够接近”小数。

如果您需要绝对精度(如果您正在使用金钱!),那么您应该考虑使用 NSDecimal 或 NSDecimalNumber 而不是 float 。

关于iphone - ObjC 将 Float 的小数位格式化为字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5292823/

相关文章:

ios - 我可以继续阅读 HealthKit 的步骤吗?

r - 根据部分字符串或子字符串更改列名称

c# - 如何使用 ContentStringFormat 显示百分比值?

iphone - NSLog 登录提交的应用程序

iphone - 如何使用注释降低 MKMapview 的缩放级别?

ios - 隐藏类型为 UIKeyboardTypeNumberPad objective c 的键盘

objective-c - 每个 CALayer 是否都有自己的 CGContextRef?

string - 从 swift 中的字符串开头修剪数字和分隔符值

iphone - 获取 iPhone 中当前的小时、分钟和秒

objective-c - 如何将参数传递给 NSTimer 中调用的方法