提问



我在float中有值25.00,但是当我在屏幕上打印它时25.0000000


如何只用两位小数显示值?

最佳参考


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


例如。:


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


%.02f告诉格式化程序你将格式化一个浮点数[[%f),并且应该舍入到两个位置,并且应该用0 s填充。


例如。:


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

其它参考1


这里有一些更正 -


//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"


等等...

其它参考2


您也可以尝试使用NSNumberFormatter:


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


你可能还需要设置负面格式,但我认为它很聪明,可以搞清楚。

其它参考3


在Swift语言中,如果你想表明你需要以这种方式使用它。要在UITextView中指定double值,例如:


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


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


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

其它参考4


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


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

其它参考5


在objective-c中,如果您正在处理常规char数组(而不是指向NSString的指针),您还可以使用:


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


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


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

其它参考6


所有答案的问题在于,因为使用了除法,所以乘法然后除以精度问题的结果。我很久以前从PDP8的编程中学到了这一点。
解决这个问题的方法是:


return roundf(number * 100) * .01;


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


您想要的精确程度取决于您。只是不要划分产品,乘以十进制等值。
不需要有趣的字符串转换。

其它参考7


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

其它参考8


这里有一些根据精度动态格式化的方法:


+ (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(向上)

其它参考9


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


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


附:此解决方案不适用于 CGFloat 类型,仅使用Float& Double

其它参考10


使用NSNumberFormattermaximumFractionDigits如下:


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


你会得到12.35

其它参考11


如果您还需要浮动值:


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

其它参考12


 lblMeter.text=[NSString stringWithFormat:@"%.02f",[**dic objectForKey:@"distance"] floatValue**];