【问题标题】:Converting NSString to Float - Adds in Decimal Places?将 NSString 转换为浮点数 - 添加小数位?
【发布时间】:2012-02-17 12:33:29
【问题描述】:

我正在从一个 XML 文件中解析一些顶点信息,该文件如下所示(部分摘录):

21081.7 23447.6 2781.62 24207.4 18697.3 -2196.96

我将字符串保存为 NSString,然后转换为浮点值(稍后我将输入到 OpenGL ES)

NSString * xPoint = [finishedParsingArray objectAtIndex:baseIndex];
                 NSLog(@"xPoiint is %@", xPoint);

                 float x = [xPoint floatValue];

问题是 float x 改变值如下:

21081.699219, 23447.599609, 2781.620117, 24207.400391, 18697.300781, -2196.959961

如您所见,它正在更改小数位数(不确定它是如何做到的 - 必须在 xml 文件中隐藏格式?)

我的问题是如何存储浮点数以匹配 NSString / XML 文件中的原始数字到相同的小数位数?

提前致谢!

【问题讨论】:

  • 您无法转换为浮动,并且不会发生这种情况。
  • 但请注意,您可以通过在显示浮点值时简单地格式化浮点值来轻松恢复类似于原始格式的内容。例如 "%4.2f" 会给你小数点后两位的数字。
  • 我需要将浮点数传递给 OpenGL,因此需要更改实际值,而不仅仅是显示值。

标签: ios objective-c floating-point nsstring


【解决方案1】:

您的问题似乎是您不了解floats 是如何存储在内存中的,也不知道浮点数不精确

精确值通常无法存储,因此系统会选择最接近的数字来表示它。如果你仔细看,你会发现每个输出的数字都非常接近你输入的值。

为了获得更好的准确性,请尝试改用double。 Double 确实遇到了同样的问题,但精度更高。浮点数大约有 6 个有效数字;双打有两倍多。 Source

以下是您应该阅读的其他一些 StackOverflow 答案和外部文章:

【讨论】:

    【解决方案2】:

    所有存储浮点数的原语都存在准确性问题。大多数时候它很小,没有关系,但有时它很重要。

    当保持准确数字很重要时,我建议使用NSDecimalNumber

    【讨论】:

      猜你喜欢
      • 2020-08-29
      • 2016-09-06
      • 2012-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多