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