0

文字列があります:61146009[サーバーから送信]

しかし、float値を出力すると

[string floatValue];

出力は61146008.000000として表示されます。文字列を61146009.0として送信しようとしましたが、それでも同じ結果になります。

なぜですか?

文字列は、を使用して61,146,009として表示する必要があります

NSString *formattedScore = [numberFormatter stringFromNumber: [NSNumber numberWithFloat: [scoreString floatValue]]];

これは、intの代わりにfloatを誤って使用したように見える他の誰かによって書かれたコード行でした

[stringintValue]を使用すると簡単に修正できることはわかっています。しかし残念ながら、コードは[string floatValue]で公開されており、新しいアップデートをリリースせずに問題を修正しようとしています。

どんな助けでも大歓迎です。ありがとう。

4

4 に答える 4

3

サーバーが文字列「61146009」を送信する場合、次のいずれかが当てはまります。

  1. サーバーにはIEEE754倍精度値があり、それを文字列に変換して送信します。
  2. サーバーにはIEEE754単精度値があり、それを文字列に正しく変換して送信していません。
  3. サーバーには、IEEE754倍精度または単精度値以外のものがあります。

2をリストする理由は、61146009がIEEE754単精度値として表現できないためです。ご覧のとおり、最も近い表現可能な値は61146008です。サーバーに61146008があり、文字列への変換が61146009を生成した場合、そのフォーマットルーチンは正しくないため、修正または置換する必要があります。修正は、サーバーが数値を文字列に変換する方法を変更することです。

1の場合、サーバーには浮動小数点数で表現できない数値があります(IEEE 754単精度オブジェクト)。これにより、クライアントはそれらをフロートに保存できなくなります。クライアントを変更したくないので、floatで表現できない値を送信しないようにサーバーを変更する必要があります。これを行う1つの方法は、サーバーを変更してその値を単精度に変換してから送信することです。変換により、倍精度値が単精度で表現可能な値に丸められます。

3の場合は1に似ています。サーバーには浮動小数点数で表すことができない数値があり、同様に変換する必要があります。

あなたが説明したことを考えると、変更されていないクライアントに61146009を表示させるような値を送信できるとは思いません。

于 2012-08-10T22:01:03.840 に答える
3

フロートではなく、ダブルを使用してください。Floatの小数点以下の桁数は約7桁です。

于 2012-08-10T21:20:39.943 に答える
2

この数値は、単精度浮動小数点数では表現できません。
16進数では、0x3A50399であるため、26ビットが必要です。これは、浮動小数点仮数で使用可能な24ビットより2ビット多くなります。
したがって、10進入力に最も近い浮動小数点数を取得します。

于 2012-08-10T21:18:02.280 に答える
0

やってみました:

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