3

NSDeciamlNumber 3.33 は、データベースに挿入すると 0.32999999999999996 になります SQL は正しいですが、SQL を実行するとデータは 0.32999999999999996 になります。私は FMDB を使用しています。列タイプ REAL、DECIMAL を試しましたが、同じ問題があります。スケールを DECIMAL 列に設定する方法がある場合。DECIMAL(8,2) を試しましたが、役に立ちません。

4

1 に答える 1

4

私の知る限り、SQLite は実際の 10 進数型を提供しておらず、浮動小数点のような数値はすべて double に変換されます。

http://www.sqlite.org/datatype3.html

DECIMAL(10,5) の場合:

TEXT と REAL ストレージ クラス間の変換の場合、SQLite は、数値の最初の有効桁数 15 桁が保持されている場合、変換がロスレスで可逆的であると見なします。TEXT から INTEGER または REAL への可逆変換が不可能な場合、値は TEXT ストレージ クラスを使用して格納されます。

REAL (8 バイトの "double") は浮動小数点データの通常の型であり、3.33 の実際の値を格納する場合は変換の問題が発生します。

オプション:

  • 文字列を格納します。遅く、メモリ効率が悪く、維持するのが面倒ですが、正しいことが保証されています。
  • 必要な小数点以下の桁数がわかっている場合は、int を格納します (通貨の値など)。
  • BLOB を保存し、好きな形式で自分でバイナリに変換します。
  • 実数 (double) を保存し、小さな違いを生きます。通貨を保存しない場合、これで問題ないことがよくあります。

通貨を保存する場合は、浮動小数点 mathを使用せずに、 int を使用してセント数 (または同様の金種) を保存します。

于 2013-11-08T14:51:41.590 に答える