【问题标题】:Objective c: Parsing string to float, avoid extra decimals目标 c:将字符串解析为浮点数,避免额外的小数
【发布时间】:2011-10-13 09:18:04
【问题描述】:

我将我通过字符串接收的一些信息转换为浮点数以获得所有信息的总和。

问题是当我转换浮点数时,例如:

myString = @"13502.63"
float *f = [myString floatValue];
NSLog(@"Converted %f", f);

“f”的结果是13502.629883

这对于某些值来说是可以的,但是当我必须添加大量的这个值时,这些额外的小数会使结果不正确。

有人可以帮帮我吗?

谢谢

【问题讨论】:

  • 多余的小数导致结果不正确是什么意思?
  • 有些值不能准确表示。当您尝试将该值存储在浮点数中时,您实际上获得了最接近的可表示值。当您对浮点数执行一系列操作时,您可能会失去准确性。请改用NSDecimalNumber

标签: objective-c floating-point int


【解决方案1】:

float数字没有精确的表示,这就是为什么“13502.63”被转换为13502.629883的原因;这是最接近原始数字的浮点数。

所以,我认为浮动没有简单的解决方案。你应该试试NSDecimalNumber。我不知道性能如何,但它应该会给你一个准确的表示。

【讨论】:

  • 你能解释一下最接近的浮动是什么意思吗?浮点数有谨慎的值吗?我的意思是,13502.630000 不是可能的浮点数吗?
【解决方案2】:

不幸的是,任何语言中的所有浮点类型都会有这个问题,因为它们必须转换为底层的二进制整数格式。

您是否考虑过使用 NSDecimalNumber?

这些将比浮点数慢得多,但如果这不是问题,那么它们对于此类计算会更准确。

如果您出于某种原因需要速度,双倍或长双倍是否足够准确?

【讨论】:

  • 请注意,double 会提高准确性,但可能会发生相同的混叠效果,但小数位要小得多 - 如果 double 证明对于您的应用程序足够准确 - 很好。
【解决方案3】:

如果您想要准确,则不应使用浮点数。使用NSDecimalNumber

NSString *myString = @"13502.63";
NSDecimalNumber *number = [NSDecimalNumber decimalNumberWithString:myString];

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-30
    • 2015-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多