从字符串到float的转换会更改数字

时间:2012-08-10 21:08:49

标签: iphone objective-c string floating-point

我有一个字符串:61146009 [从服务器发送]

但是当我打印其浮动值

[string floatValue];

输出为61146008.000000。我也试过将字符串发送为61146009.0,但结果仍然相同。

知道为什么吗?

字符串需要使用

显示为61,146,009
NSString *formattedScore = [numberFormatter stringFromNumber: [NSNumber numberWithFloat: [scoreString floatValue]]];

这是由其他人编写的一行代码,他们似乎错误地使用了float而不是int

我知道使用[string intValue]可以轻松修复它。但不幸的是,代码与[string floatValue]一起使用,我试图解决问题,而不必发布新的更新。

感谢任何帮助。感谢。

4 个答案:

答案 0 :(得分:3)

使用double,而不是float。 Float大约有7个十进制数字。

答案 1 :(得分:3)

如果服务器发送字符串“61146009”,则其中一个为真:

  1. 服务器具有IEEE 754双精度值,将其转换为字符串,然后发送。
  2. 服务器具有IEEE 754单精度值,将其严重转换为字符串,然后发送。
  3. 服务器不具有IEEE 754双精度或单精度值。
  4. 我列出2的原因是61146009不能表示为IEEE 754单精度值。如您所见,最接近的可表示值是61146008.如果服务器有61146008并转换为生成61146009的字符串,则其格式化例程很糟糕,应该修复或替换。您的修复方法是更改​​服务器将数字转换为字符串的方式。

    在1的情况下,服务器具有无法在float(IEEE 754单精度对象)中表示的数字。这使得客户端无法将它们存储在浮点数中。由于您不想更改客户端,因此您必须更改服务器永远不要发送无法在float中表示的值。一种方法是修改服务器以将其值转换为单精度,然后发送它。转换将双精度值四舍五入为单精度可表示的值。

    3的情况类似于1:服务器的数字无法在浮点数中表示,您需要进行类似的转换。

    鉴于您所描述的内容,我不认为您可以发送任何可能导致未修改的客户端显示61146009的值。

答案 2 :(得分:2)

此数字在单精度浮点数中无法表示 在十六进制中,它是0x3A50399,因此需要26位,比Float尾数中的24位多两位。
因此,您将最接近的浮点数输入到小数输入。

答案 3 :(得分:0)

你试过了吗?

[NSString stringWithFormat:@"%.0f",string]