printf / appendFormat中浮动不精确

时间:2012-03-20 20:37:04

标签: objective-c c

我有一个浮点值,我希望以格式字符串显示它,如果它对应于一个int,则显示整数,如果没有,则显示一个小数。

像这样:

3.1
3
2.9
2.8

现在我陷入困境,在这个概念中,我会做那样的事情:

float myFloat = 3.1
float mySecondFloat = 3
[NSString stringWithFormat:@"%g %g", myFloat, mySecondFloat];

我的问题是:

1 /类型格式“%g”在大多数情况下有效,但有时我的结果显示为“0.600001”,而实际上应该有0.6,因为我所做的只是0.7 - 0.1。

是否有一种类型转换为浮点数为1位小数或者可能是按位运算以消除最终的不精确度,或其他方式使其在100%的情况下有效?

感谢您的回答。

3 个答案:

答案 0 :(得分:1)

您必须使用此代码:

float myFloat = 3.1
float mySecondFloat = 3
[NSString stringWithFormat:@"%.1f %.1f", myFloat, mySecondFloat];

编辑:

如果我真的想打印浮点数的整数值,我会这样做(丑陋的代码)

int intValue = myFloatNumber/1;
NSString *string;
if(myFloatNumber == intValue)
{
     string = [NSString stringWithFormat:@"%.0f", myFloatValue];
}
else
{
    string = [NSString stringWithFormat:@"%.1f", myFloatValue];
}

将整数除以1,您自动将浮点数转换为int。 获得NSString *字符串后,您可以将其连接到字符串。

答案 1 :(得分:1)

如果使用十进制数字时需要绝对精确度,可以考虑使用NSDecimalNumber类。

Number and Value Programming Topics: Using Decimal Numbers

否则,%.1g格式说明符就可以了。

答案 2 :(得分:0)

看到别人的答案,似乎没有标准的C格式化程序来实现这一点。

我去了Nicolas的回答(NSDecimalNumber),因此解决了标志。它确实工作得很好,但是,在我(非常简单)的情况下,它可能有点矫枉过正。给我第二个想法,如果我不得不再做一次,我想我会在NSNumber上使用NSNumberFormatter(使用numberWithFloat:方法)

如果它可以帮助某人......