0

我有一个字符串: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

4 回答 4

3

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

  1. 服务器有一个 IEEE 754 双精度值,将其转换为字符串,然后发送。
  2. 服务器有一个 IEEE 754 单精度值,将其严重转换为字符串,然后发送。
  3. 服务器具有 IEEE 754 双精度或单精度值以外的其他值。

我列出 2 的原因是 61146009 不能表示为 IEEE 754 单精度值。如您所见,最接近的可表示值是 61146008。如果服务器有 61146008 并且转换为字符串产生 61146009,那么它的格式化例程是错误的,应该修复或替换。您的解决方法是更改​​服务器将数字转换为字符串的方式。

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

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

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

于 2012-08-10T22:01:03.840 回答
3

使用双精度,而不是浮点数。浮点数大约有 7 位小数位精度。

于 2012-08-10T21:20:39.943 回答
2

此数字不能以单精度浮点数表示。
在十六进制中,它是 0x3A50399,因此它需要 26 位,比浮点尾数中可用的 24 位多两位。
因此,您将获得最接近十进制输入的浮点数。

于 2012-08-10T21:18:02.280 回答
0

你有没有尝试过:

[NSString stringWithFormat:@"%.0f",string]
于 2012-08-10T21:13:11.990 回答