【问题标题】:Objective-C: Convert the entire double value to string without losing dataObjective-C:将整个双精度值转换为字符串而不丢失数据
【发布时间】:2013-05-10 17:42:12
【问题描述】:

我有以下双精度值:0.000900137869045636 我想将其转换为NSString

我尝试了以下代码,但无论如何,它都会将值四舍五入:0.000900138

[NSString stringWithFormat:@"%.20lf", [currentLocation coordinate].latitude];

我应该怎么做才能保持双数不变?

谢谢。

【问题讨论】:

  • 你如何检查结果字符串的值?
  • 它不会对我截断,你确定你的 double 包含那个值吗?
  • 请记住,运行上述语句不会以某种方式修改latitude,以便以后以更宽的格式打印。您需要使用stringWithFormat 调用的输出。
  • 我在调试期间看到了值,使用断点。

标签: objective-c string nsstring double


【解决方案1】:

使用

创建一个 NSNumber

NSNumber *myDoubleNumber = [NSNumber numberWithDouble:myDouble];

然后调用

[myDoubleNumber stringValue];

【讨论】:

  • +1 即使我更喜欢 @(myDouble) 而不是 [NSNumber numberWithDouble:myDouble]
  • 这依赖于NSNumber 的内部格式,并不是获得精确定义输出的好方法。
  • 谢谢,效果很好。它也将数字四舍五入,但只有最后一个数字,我可以忍受:)
【解决方案2】:

简答:使用%.18lf - 用 0.000900137869045633 测试 -> 0.000900137869045639。但不要自欺欺人,这是精确的,它只是由于四舍五入才有效。

【讨论】:

  • 那么 .18lf 和 .20lf 对数字进行舍入不同吗?
  • @thedp - 首先,您拥有的数字有 18 个小数位,而不是 20 个。当您格式化小数时,最后一位数字被四舍五入。您的十进制数没有精确的二进制等价物,但是当四舍五入到 18 位十进制数字时,二进制匹配,四舍五入到 20 则没有。双精度浮点数实际上只有 15-17 位的小数精度,所以你在这里推了极限,因此我的评论是这不精确 - 你很幸运,你的 18 位数字是一样的。如果您需要具有这种精度的数字,请使用 NSDecimalNumber,它具有高达 38 位的精度。
【解决方案3】:

据我所见,您的代码似乎没有任何问题:我刚刚尝试了以下方法,

int main(int argc, const char * argv[])
{

    double foo = 0.000900137869045636;
    NSLog([NSString stringWithFormat:@"%.20lf", foo]);

    return 0;
}

日志输出为:

2013-05-10 14:00:18.492 Test[71101:303] 
0.00090013786904563598

所以不确定你的问题是什么,但它不在 NSString 创建中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-26
    • 2013-10-10
    • 2015-04-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多