25.00
中的值为float
,但当我在屏幕上打印时,它为25.0000000
。
如何只用两位小数显示值?
答案 0 :(得分:638)
这不是数字如何存储的问题,而是你如何显示它的问题。将其转换为字符串时,必须舍入到所需的精度,在您的情况下是两位小数。
E.g:
NSString* formattedNumber = [NSString stringWithFormat:@"%.02f", myFloat];
%.02f
告诉格式化程序您将格式化浮点数(%f
),并且应该舍入到两个位置,并且应该用0
填充。
E.g:
%f = 25.000000
%.f = 25
%.02f = 25.00
答案 1 :(得分:190)
以下是一些更正 -
//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 :(得分:20)
您也可以尝试使用NSNumberFormatter:
NSNumberFormatter* nf = [[[NSNumberFormatter alloc] init] autorelease];
nf.positiveFormat = @"0.##";
NSString* s = [nf stringFromNumber: [NSNumber numberWithFloat: myFloat]];
您可能还需要设置负片格式,但我认为它很聪明,可以解决这个问题。
答案 3 :(得分: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
答案 4 :(得分:9)
在Swift语言中,如果你想表明你需要以这种方式使用它。要在UITextView中指定double值,例如:
let result = 23.954893
resultTextView.text = NSString(format:"%.2f", result)
如果你想在LOG中显示像objective-c那样使用NSLog(),那么在Swift语言中你可以这样做:
println(NSString(format:"%.2f", result))
答案 5 :(得分:3)
在objective-c中,如果你正在处理常规字符串数组(而不是指向NSString的指针),你也可以使用:
printf("%.02f", your_float_var);
OTOH,如果您想要的是将该值存储在您可以使用的char数组中:
sprintf(your_char_ptr, "%.02f", your_float_var);
答案 6 :(得分:3)
所有答案的问题在于,由于您使用了除法,因此乘法然后除以精度问题会导致结果。我很久以前从PDP8的编程中学到了这一点。 解决这个问题的方法是:
return roundf(number * 100) * .01;
因此15.6578只返回15.66而不是15.6578999或类似的东西。
您需要什么级别的精确度取决于您。只是不要分割产品,乘以十进制等值。 不需要有趣的字符串转换。
答案 7 :(得分:1)
在目标-c中你想要显示2个十进制数的浮点值然后传递参数,表明你想要显示多少个小数点 例如0.02f将打印25.00 0.002f将打印25.000
答案 8 :(得分: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];
=&GT; 2.3453
[TSPAppDelegate stringByFormattingString:@"2.346324" toPrecision:0];
=&GT; 2
[TSPAppDelegate stringByFormattingString:@"2.346324" toPrecision:2];
=&GT; 2.35(向上)
答案 9 :(得分:1)
Swift 的另一种方法(不使用NSString):
let percentage = 33.3333
let text = String.localizedStringWithFormat("%.02f %@", percentage, "%")
P.S。此解决方案不适用于仅使用Float
&amp;测试的 CGFloat 类型。 Double
答案 10 :(得分:1)
将NSNumberFormatter
与maximumFractionDigits
一起使用,如下所示:
NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
formatter.maximumFractionDigits = 2;
NSLog(@"%@", [formatter stringFromNumber:[NSNumber numberWithFloat:12.345]]);
您将获得12.35
答案 11 :(得分:0)
如果您还需要浮动值:
NSString* formattedNumber = [NSString stringWithFormat:@"%.02f", myFloat];
float floatTwoDecimalDigits = atof([formattedNumber UTF8String]);
答案 12 :(得分:0)
lblMeter.text=[NSString stringWithFormat:@"%.02f",[[dic objectForKey:@"distance"] floatValue]];