使浮点数只显示两位小数

303
我有一个float类型的值为25.00,但是当我在屏幕上打印它时,它变成了25.0000000
如何只显示两位小数?

var nf = NSNumberFormatter() nf.positiveFormat = "0.##" var numberAfterRound = nf.stringFromNumber(NSNumber(double: number))! - kalpeshdeo
13个回答

662

问题不在于数字的存储方式,而在于它的显示方式。当将其转换为字符串时,您必须按所需精度舍入,这在您的情况下是保留两位小数。

例如:

NSString* formattedNumber = [NSString stringWithFormat:@"%.02f", myFloat];

%.02f 表示你将要格式化一个浮点数 (%f) ,并且需要四舍五入到小数点后两位,同时在左侧填充 0

例如:

%f = 25.000000
%.f = 25
%.02f = 25.00

7
我注意到在你的例子中使用%.2f实际上返回的是25.00而不是25,这很奇怪。 - fulvio
3
我理解的方式是小数点后的数字表示你想要的小数位数。因此,.2f 确实会给出 25.00,.4f 会给出 25.0000。 - Erik S
4
如果有人好奇如何实际获得25,那么@"%.f"就可以实现。但是上面所写的并不行。 - Alex Gray
4
如果你使用 @"%.*f", decimalPlaces, number - Jonathan.
13
可能这会有点偏题,但我想添加另一种格式:%03.f = 025 - SoftDesigner
显示剩余4条评论

201

以下是一些更正:

//for 3145.559706

Swift 3

let num: CGFloat = 3145.559706
print(String(format: "%f", num)) = 3145.559706
print(String(format: "%.f", num)) = 3145
print(String(format: "%.1f", num)) = 3145.6
print(String(format: "%.2f", num)) = 3145.56
print(String(format: "%.02f", num)) = 3145.56 // which is equal to @"%.2f"
print(String(format: "%.3f", num)) = 3145.560
print(String(format: "%.03f", num)) = 3145.560 // which is equal to @"%.3f"

Obj-C

@"%f"    = 3145.559706
@"%.f"   = 3146
@"%.1f"  = 3145.6
@"%.2f"  = 3145.56
@"%.02f" = 3145.56 // which is equal to @"%.2f"
@"%.3f"  = 3145.560
@"%.03f" = 3145.560 // which is equal to @"%.3f"

等等,等等……


最后一个准确吗?@"%.03f" = 3145.566?你是怎么得到 .566 而不是 .560 的? - pixelfreak
确定小数位数的整数可以是一个变量吗?例如 @"%.xf" 中的 x 可以是任何整数吗? - acecapades
如果你在使用 @"%.f" 时遇到问题,可以尝试使用 @"%.0f"。我发现这个方法可以得到没有小数位的结果,而另一个方法则不行。 - sam_smith
1
有人能告诉我为什么要使用%.02f而不是只用%.2f吗? - hinterbu

20

你也可以尝试使用NSNumberFormatter:

NSNumberFormatter* nf = [[[NSNumberFormatter alloc] init] autorelease];
nf.positiveFormat = @"0.##";
NSString* s = [nf stringFromNumber: [NSNumber numberWithFloat: myFloat]];

您可能还需要设置负数格式,但我认为它足够智能以找出正确的格式。


你需要这个浮点数 numTwoDecimalDigits = atof([s UTF8String]); - loretoparisi

10

我基于以上答案创建了一个Swift扩展。

extension Float {
    func round(decimalPlace:Int)->Float{
        let format = NSString(format: "%%.%if", decimalPlace)
        let string = NSString(format: format, self)
        return Float(atof(string.UTF8String))
    }
}

使用方法:

let floatOne:Float = 3.1415926
let floatTwo:Float = 3.1425934
print(floatOne.round(2) == floatTwo.round(2))
// should be true

这个解决方案似乎也适用于CGFloat。太棒了! - Sentry.co
这正是我在寻找的。谢谢,伙计! - Tushar Katyal

9
在Swift语言中,如果您想显示文本,需要以以下方式使用。例如,在UITextView中分配双精度值:
let result = 23.954893
resultTextView.text = NSString(format:"%.2f", result)

如果你想像Objective-C一样使用NSLog()在LOG中显示信息,那么在Swift语言中可以这样做:

println(NSString(format:"%.2f", result))

4
所有答案的问题在于乘法和除法相结合会导致精度问题。我很早以前就从PDP8编程中学到了这一点。解决这个问题的方法是:
return roundf(number * 100) * .01;

因此,15.6578仅返回15.66,而不是15.6578999或其他意外的结果。
您需要的精度级别取决于您。只需不要除以产品,将其乘以小数等效值即可。无需进行有趣的字符串转换。

3

在Objective-C中,如果你正在处理普通的字符数组(而不是指向NSString的指针),你也可以使用:

printf("%.02f", your_float_var);

另一方面,如果您想将该值存储在char数组中,您可以使用以下方法:

sprintf(your_char_ptr, "%.02f", your_float_var);

1

使用以下方式将maximumFractionDigitsNSNumberFormatter一起使用:

NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
formatter.maximumFractionDigits = 2;
NSLog(@"%@", [formatter stringFromNumber:[NSNumber numberWithFloat:12.345]]);

你将会得到 12.35


1
这里有一些根据精度动态格式化的方法:
+ (NSNumber *)numberFromString:(NSString *)string
{
    if (string.length) {
        NSNumberFormatter * f = [[NSNumberFormatter alloc] init];
        f.numberStyle = NSNumberFormatterDecimalStyle;
        return [f numberFromString:string];
    } else {
        return nil;
    }
}

+ (NSString *)stringByFormattingString:(NSString *)string toPrecision:(NSInteger)precision
{
    NSNumber *numberValue = [self numberFromString:string];

    if (numberValue) {
        NSString *formatString = [NSString stringWithFormat:@"%%.%ldf", (long)precision];
        return [NSString stringWithFormat:formatString, numberValue.floatValue];
    } else {
        /* return original string */
        return string;
    }
}

e.g.

[TSPAppDelegate stringByFormattingString:@"2.346324" toPrecision:4];

=> 2.3453

[TSPAppDelegate stringByFormattingString:@"2.346324" toPrecision:0];

=> 2

[TSPAppDelegate stringByFormattingString:@"2.346324" toPrecision:2];

=> 2.35(向上取整)


这是非常好的解决方案,非常感谢。你能向我解释一下它是如何工作的吗?我看到你添加了额外的“%”符号。 - Eugene Alexeev

1

在Objective-C中,如果您想要以2位小数显示浮点值,则需要传递参数指示您想要显示多少个小数点。 例如,0.02f将打印25.00,0.002f将打印25.000。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接