【问题标题】:NSString to CLLocationDegrees to NSString is changing valueNSString 到 CLLocationDegrees 到 NSString 正在改变值
【发布时间】:2016-05-04 21:53:34
【问题描述】:

我正在从 JSON API 获取纬度和经度。这些值以字符串形式出现。

我将值存储在 CLLocationDegrees 中,如下所示:

CLLocationDegrees lat = [[coordinates objectForKey:@"lat"] doubleValue];
CLLocationDegrees lon = [[coordinates objectForKey:@"lat"] doubleValue];

但是当我后来从latlon 检索值并将它们放入NSString 时,该值已与JSON 提供的值不同。变化通常只是坐标的最后几位,但足以引起问题。

NSString *latitude = [[NSNumber numberWithDouble:lat] stringValue];
NSString *longitude = [[NSNumber numberWithDouble:lon] stringValue];

基本上,此时[coordinates objectForKey:@"lat"] 不等于latitude

任何有关如何解决此问题的提示将不胜感激

【问题讨论】:

    标签: objective-c json nsstring cllocation


    【解决方案1】:

    NSNumber stringValue 会给你一个默认的表示,通常只有 5 个小数位。

    一种选择是使用 stringWithFormat 并使用与原始 JSON 中的数据相匹配的格式。

    NSString *latitude = [NSString stringWithFormat:@"%.7f", lat];
    

    调整格式说明符以满足您的确切需求。

    还请记住,由于浮点数的表示方式的性质,从原始字符串转到 double 可能会导致一些精度损失。除了保留对原始字符串的引用(如果它很重要)之外,您无能为力。

    【讨论】:

    • 我应该在原帖中这样说,但这并不是说我失去了精度......数字的长度相同但正在变化。比如一个从40.78399658203125变成40.7839965820328……最后的5变成了8。这还是同样的格式情况造成的吗?
    • double 适用于大约 15 个有效数字。数字40.78399658203125 有 16 位有效数字。所以你可以期待一些损失。即使由于位数没有损失,您也可以看到由于无法以浮点类型(如double)表示所有可能值而造成的明显损失。
    猜你喜欢
    • 1970-01-01
    • 2011-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-18
    • 1970-01-01
    • 2011-09-28
    • 2019-04-30
    相关资源
    最近更新 更多