使浮点数仅显示两位小数


296

我有值25.00float,但是当我打印在屏幕上它25.0000000
如何只显示两个小数位的值?


var nf = NSNumberFormatter()nf.positiveFormat =“ 0。##” var numberAfterRound = nf.stringFromNumber(NSNumber(double:number))!
kalpeshdeo 2015年

Answers:


648

这与数字的存储方式无关,而与显示方式有关。将其转换为字符串时,必须四舍五入到所需的精度,在您的情况下为两位小数。

例如:

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

%.02f告诉格式化程序,您将格式化float(%f),并且应将其四舍五入到两个位置,并用0s 填充。

例如:

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

7
我注意到在您的示例中使用%.2f实际上返回25.00,而不是25。这很奇怪。
fulvio

3
我一直了解的方式是,小数点后的数字表示您获得了多少个小数。因此,.2f确实会给25.00,而.4f会给25.0000。
Erik S

3
如果有人想了解作为一个如何 真正得到 25 .. @"%.f"的伎俩。上面写的不是
亚历克斯·格雷

4
@acecapades,如果使用@"%.*f", decimalPlaces, number
乔纳森。

12
可能这将是部分话题,但我要添加另一种格式:%03.f = 025
SoftDesigner 2013年

197

以下是一些更正-

//for 3145.559706

迅捷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"

对象

@"%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 2011年

确定小数位数的整数可以是变量吗?像@“%。xf”,其中x可以是任何整数?
acecapades 2012年

如果您在@“%。f”方面遇到问题,请尝试@“%。0f”。我发现此方法在没有其他小数位数的情况下无法获得小数位
simon_smiley 2014年

1
谁能告诉我为什么要使用%.02f而不是%.2f?
hinterbu '17

20

您也可以尝试使用NSNumberFormatter:

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

您可能还需要设置否定格式,但我认为它很聪明可以弄清楚。


您需要此float numTwoDecimalDigits = atof([s UTF8String]);
loretoparisi 2013年

10

根据上述答案,我进行了快速扩展

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一起使用。太棒了!
eonist

这就是我想要的。谢了哥们!
Tushar Katyal 18/12/26

9

在Swift语言中,如果要显示,则需要以这种方式使用。要在UITextView中分配双精度值,例如:

let result = 23.954893
resultTextView.text = NSString(format:"%.2f", result)

如果要像使用NSLog()那样像在Objective-c中那样显示在LOG中,那么在Swift语言中,您可以这样做:

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

3

在Objective-C中,如果要处理常规字符数组(而不是指向NSString的指针),则还可以使用:

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

OTOH,如果您想要将该值存储在char数组中,则可以使用:

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

3

所有答案的问题在于,由于您使用了除法运算,所以相乘然后除结果会导致精度问题。我很久以前从PDP8编程中学到了这一点。解决此问题的方法是:

return roundf(number * 100) * .01;

因此15.6578仅返回15.66,而不返回15.6578999或类似的意外内容。

您想要什么精度水平取决于您。只是不要将乘积除以十等值。不需要有趣的字符串转换。


1

在目标-c中您是否要以2个十进制数显示浮点值,然后传递参数以指示您要显示多少个小数点,例如0.02f将打印25.00 0.002f将打印25.000


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;
    }
}

例如

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

=> 2.3453

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

=> 2

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

=> 2.35(向上舍入)


那是非常好的解决方案,非常感谢。你能告诉我它是如何工作的吗?我看到您添加了额外的'%'符号。
尤金·阿列克谢夫

1

Swift的另一种方法(不使用NSString):

let percentage = 33.3333
let text = String.localizedStringWithFormat("%.02f %@", percentage, "%")

PS此解决方案不适用于仅通过&测试的CGFloat类型FloatDouble


1
@Unknown downvoter这是swift的有效解决方案,也不同于其他的swift答案,为什么?
2015年

如果您可以返回浮点数,则始终可以将其转换为CGFloat
eonist

1

使用NSNumberFormatter具有maximumFractionDigits如下:

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

你会得到 12.35


0

如果还需要浮动值:

NSString* formattedNumber = [NSString stringWithFormat:@"%.02f", myFloat];
float floatTwoDecimalDigits = atof([formattedNumber UTF8String]);

0
 lblMeter.text=[NSString stringWithFormat:@"%.02f",[[dic objectForKey:@"distance"] floatValue]];
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.