【问题标题】:Objective C float is not showing all decimals目标 C 浮点数未显示所有小数
【发布时间】:2012-10-31 14:54:14
【问题描述】:

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

这是一个例子:

[[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&long=-34.603047

更多。我从输出终端得到什么:

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

有什么想法吗?

【问题讨论】:

    标签: objective-c floating-point double nsnumber


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-02-15
        • 2015-04-06
        • 2010-10-08
        • 2011-09-03
        • 1970-01-01
        • 1970-01-01
        • 2011-03-10
        相关资源
        最近更新 更多