2009-07-13 12 views
3

とオブジェクトへ:変換JSON文字列は、私は、文字列を有する選択評価

"{0:16970861903381446063,length:1}" 

Iはeval方法を使用してオブジェクトに変換しようとしたが、それはまた、文字列を評価し、それゆえ戻り、数値を丸め。 Iは、JSON文字列を作成するときの値として16970861903381446063 + ''を用いてその上にeval、 を呼び出す前に文字列として番号を渡す試み

{0:16970861903381447000,length:1} 

typeofでそれをチェックするタイプstringであるとして、それを示しているが、それはまだ

16970861903381447000.に数16970861903381446063を丸め、私はこれを回避することができる方法、またはこれを行うには良い方法はありますか?続き

は数字

function simplify(arr){ 
     request = "{"; 
     if (arr.length ==1){ 
     request += 0 + ":" + (arr[0] + '') + "," ; 
     } 
     else{ 
     for (var i=0;i<=arr.length-1 ;i++){ 

     request += i + ":" + (arr[i] + '') + ","; 
    } 
    } 
    request += "length" + ":" + arr.length +"}"; 
    return request; 
} 

答えて

3

を引用符を追加した後のサンプル出力です指数。

Javascript番号は、すべて64ビットの浮動小数点数で表されます。多くの言語の浮動小数点数は、仮数部と指数部の2つの部分で表されます。 Javascriptでは、仮数は53ビットであり、指数は11ビットです。

もし数値は、例えば、3.5346367e + 22、として表現見ると、仮数は3.5246367であり、指数は、あなたが格納しようとしている22

番号が仮の最大値よりも大きいですあなたの数字は丸められ、大きな数字は指数を得ます。

これらの巨大な数値を使用して算術演算を行っている場合を除き、ストリングとして保存する必要があります。

最後に、あなたが実際にJSON配列としてではなく、整数キーとlengthプロパティを定義することによって、配列のふりをオブジェクトとしてJSON配列を表明する必要があります

// Do this 
json = '["16970861903381446063"]'; 

// Not this 
json = '{0:"16970861903381446063", length:1}'; 
+0

確認していただきありがとうございます。 FPは悪です。 –

2

を含む配列からJSONテキストを生成するコードであるあなたはを通して文字列に全体の方法を、それを維持する必要があるような音。しかし、あなたがそれを行うなら、どのようにそれを使って数学をするつもりですか?

+1

をまあそれが問題だ、私はバイパスに期待していましたそれを文字列にして構文解析し、計算が行われているサーバー側で整数に戻します。 – Amit

+1

私は、数値が大きすぎて整数として使用できず、代わりに浮動小数点として扱われていると考えています。フロートは広い範囲を持っていますが、近似しています。 –

+0

これを追加してみましょう。これが当てはまる場合、答えは、数字の文字列を右から壊して、整数のセットに格納することです。 –

3

単なる文字列を作るために、引用符でラップ:

{ 
    0: "16970861903381446063", 
    length: 1 
} 

私はあなただけで、文書内のどこかで、このを使用していると仮定しています。または実際の番号として使用する予定ですか?

+1

はい(サーバー側で)数値として使用したいのですが、評価をバイパスして文字列に変換する他の方法は考えられません。 – Amit

0

よしが

function simplify(arr){ 
     request = "{"; 
     if (arr.length ==1){ 
      request += (0 + ":" + "'" + String(arr[0])+ "'" + ",") ; 
     } 
     else{ 
      for (var i=0;i<=arr.length-1 ;i++){ 
      request += i + ":" + "'" + String(arr[i]) + "'" + ","; 
     } 

    } 
     request += "length" + ":" + arr.length +"}" ; 
return request; 
    } 

問題は、私は、彼らが(evalをすることができませんでしたいくつかの文字列を必要な数字とはevalした文字列リテラルで配列を使用していたにもかかわらず、evalをしていましたfreenodeので人々に簡単な解決策のおかげで見つかりました) 'ed。続き

は明示的には、仮数部53ビットと11ビットを使用してIEEE倍精度浮動小数点の精度に直面して実行している文字列に

{0:'16970861903381446063',1:'16970861903381444012',length:2} 
+0

大きな数字を文字列として渡すと、解析の問題が回避されます。しかし、クライアント側でこれらの数値を数学的に計算する必要はありますか? –

+0

また、シリアライズ形式についてのトリプティクの要点は、死んでいます。 –

+0

はい、サーバー側で処理されるため、文字列として使用するようになりました。もう一度ありがとう。 – Amit