2012-03-20 55 views
-1

我有一个浮点值,我想显示它在格式字符串,如果它对应于一个int,显示整数,如果没有,显示它与一位小数。浮点不精确printf/appendFormat

像这样:

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%的情况下工作?

谢谢您的回答。

+1

你的“现实”不幸的是,它并不符合世界其他地方的现实,特别是与您计算机硬件的实际情况不符:-( – 2012-03-20 20:39:14

+1

您所需的精度总是保持一位小数?如果是这样,您最好将其存储为整数(比你希望的值大10倍),并且有一个打印功能,可以将小数点放在正确的位置,否则,你将遇到无法准确表示为浮点数的问题(例如,'0.6'你的例子) – 2012-03-20 21:52:04

+0

@KerrekSB你可以将我重定向到一篇文章解释g为我的计算机硬件的现实带来了这个结果。我只是好奇它是如何在幕后工作的。 – moxy 2012-03-21 22:00:26

回答

1

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

Number and Value Programming Topics: Using Decimal Numbers

否则,%.1g格式说明会确定。

+0

是的,我已经读过NSDecimalNumber类在那里覆盖浮点数的不精确性。我会试一试。 “%.1g”格式说明符根本无法按预期工作。 – moxy 2012-03-21 06:19:54

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 *字符串,你可以将它连接到你的字符串。

+0

这就是我要做的,如果我没有任何其他的选择,但这段代码将打印出“3.1 3.0”,我会优先显示“3.1 3”。 – moxy 2012-03-20 20:53:19

+0

我编辑了我的答案,检查它是否是你想要的:) – Lolloz89 2012-03-20 21:29:28

+0

浮点数除以int产生浮点数;除以1不是导致隐式转换的原因,它是将它分配给int的事实。 – 2012-03-20 21:49:56

0

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

我跟着尼古拉回答(NSDecimalNumber),因此解决标志。它确实工作得很好,但是,在我的(非常简单)的情况下,它可能是矫枉过正的。给它一个第二个想法,如果我不得不做一遍,我认为我会(使用numberWithFloat:法)去一个NSNumber的只使用NSNumberFormatter

如果它可以帮助别人..

+0

我会使用:'[[NSNumber numberWithFloat:myFloat] stringValue];',因为它会自动处理+/- .00000001。 – lnafziger 2012-04-07 15:21:00