Objective C float未显示所有小数

时间:2012-10-31 14:54:14

标签: objective-c floating-point double nsnumber

我正在向一个方法传递一个浮点数,但它没有显示所有小数。我不知道为什么会这样。

以下是一个例子:

[[LocationApiCliente sharedInstance] nearPlacesUsingLatitude:-58.3645248331830402 andLongitude:-34.6030467894227982];

然后:

- (BOOL)nearPlacesUsingLatitude:(double)latitude andLongitude:(double) longitude {



    NSString *urlWithCoords = [NSString stringWithFormat:@"%@&lat=%f&long=%f", CountriesPath, latitude, longitude];

打印urlWithCoords将导致:

格式= JSON&安培; LAT = -58.364525&安培;长= -34.603047

更多这一点。我从输出终端得到的是什么:

(lldb) p -3.13419834918349f
(float) $4 = -3.1342
(lldb) p -3.13419834918349
(double) $5 = -3.1342

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

更改格式字符串中的%f以指定所需的小数位数,例如%.16f

请注意,显示的小数位数并不能保证它们正确,但至少它们不会被截断。

总的来说问题是浮点数不包含有关精度的信息,并且不能精确地表示一些十进制值,因此格式化不能在一般情况下“自动检测”小数位数。因此,您只需要通过指定所需的数字来覆盖默认值,并接受它不代表位置准确性。但是,由于您似乎通过URL将浮动数传递给另一个程序,这应该不是问题 - 更多的小数更好。

答案 1 :(得分:0)

看起来CoreLocation使用双精度来表示度数,所以如果在设备上找到更多的地理精度,我会感到惊讶。

但是,一般来说,如果你想表示比double更高的精度,你可以在Objective-C中使用long double,就像这样......

long double myPi = 3.141592653589793;
NSLog(@"%16.16Lf", myPi);