どのようにI'トリム'C#doubleの値で保管されており、有望と考えていsqliteデータベース?

StackOverflow https://stackoverflow.com/questions/4200736

質問

その場合ステレオフォーンジャッdouble値など x = 0.56657011973046234 にsqliteデータベースを検索では、後を取得しま y = 0.56657011973046201.に応じて sqlite仕様.純仕様 (いずれも難しい問題になるかもしれないと困る)ことが期待されます。

私の問題は、高精度な重要なのは、私のアプリのお得なユーザーの入力選択double値を表す基本的な3Dの情報、その走行シミュレーションデスクです。この入力保存することができ、sqliteデータベースをリローデッドを再実行す。

の混乱が生じなので、出来たて作成したシリーズの投入することは明らかシミュレーやって、いろいろな方法でも同じように入力を一度に格納され、再ロードし、ダブルの値を変更した.これは論理的なdesireable.

いかにおいてどう扱うかということがない限/クランプはユーザの入力値で正確に保存されsqliteデータベースです。なる 0.56657011973046234, では実際に変 0.56657011973046201.

しかししていきたいめには、与えられた番号、価値というものがデータベースに格納され、実際に保存してから、データベースという無骨.あいということが?

役に立ちましたか?

解決

ダブルラウンドは、桁数を指定するパラメータを使用して実装されています。 14桁の数字(例えば)にラウンドにこれを使用して:rvalに=恐らくMath.round(ヴァル、14)

次にラウンドデータベースから値を受信したとき、およびシミュレーション、すなわちの先頭に。だから、値が一致で?

詳細については、

http://msdn.microsoft.com/en-us/library/ 75ks3aby.aspxする

もう一つの考えあなたがちょうどそれらを格納し、データベース内の値を比較していない場合:なぜ単にバイナリデータとして保管していませんか?そして、すべてのビットが格納されると、そのまま回復?

他のヒント

答えは、17桁の文字列としてダブル値を格納することであってもよいです。

:SQLiteのは、テキスト対実数をどのように扱うかの違い(私は簡単にするために、コマンドラインインタフェースで説明します)を見て
sqlite> create table t1(dr real, dt varchar(25));
sqlite> insert into t1 values(0.56657011973046234,'0.56657011973046234');
sqlite> select * from t1;
0.566570119730462|0.56657011973046234

は、実際の親和性とそれを格納することは、あなたの問題の原因である - SQLiteはあなただけは15桁の近似値をバックアップできます。代わり場合は、テキストとしてそれを保存、あなたのC#のプログラムで、元の文字列を取得し、元の二重に変換することができます。

値は時に変更すべきではありませんので、あなたは(側面の両方で同じ浮動小数点型を使用した場合、

はSQL Liteのと.NETの両方が正しくIEEE仕様を実装すると仮定すると、あなたは同じ数値結果を得ることができる必要があります)データベースからC#およびその逆に渡されます。

現在、あなたは、SQL Liteの8バイトのIEEE浮動小数点(シングル)(*)を使用していて、C#(ダブル)で16バイトの浮動小数点。 8バイトのIEEE標準にC#の対応でfloatタイプ、このタイプの代わりdoubleを使用して問題を解決することができます。

(*)SQL Liteのドキュメントは、REALは、IEEE 8バイト浮動小数点数のとして保存の浮動小数点値であることを述べています。

あなたはデシベルで#を格納するための文字列を使用することができます。個人的に私は()の数値を使用()格納する前にとDBから取り出した後、丸めの提案winwaed何をやっています。

私は丸め銀行家によって焼かれて思い出すが、それはちょうどそれが仕様を満たしていませんでした可能性があります。

解析されたときにあなたは文字列として、文字列に二重に変換するとき、同じ値を生成するために保証のフォーマット往復を使用することにより、二重に保存することができます:

string formatted = theDouble.ToString("R", CultureInfo.Invariant);
あなたは往復に小数点以下の入力値をしたい場合は、

、あなたは15桁にそれらを制限する必要があります。あなたは往復にSQLiteの内部の倍精度浮動小数点値をしたい場合は、運が悪いかもしれません。 17桁の最小値に印刷する必要がありますが、私が言うことができるものから、SQLiteは15(編集の最大値にそれらを印刷している:<ストライキ>は多分SQLiteの専門家は、この私はそれをソースコードを読み取り、トレース - 私が正しかった、精度は15桁に制限されている)

私はWindows上でSQLiteのコマンドインタフェースで、あなたの例をテストしました。私は0.56657011973046234を挿入し、0.566570119730462を返して選択します。私は17桁にそれをダブルに0.566570119730462を割り当てられ、印刷されたC、で、私は0.56657011973046201を得ました。それはあなたがC#から得る同じ値です。別の浮動小数点数に0.56657011973046234と0.56657011973046201マップ、換言すれば、SQLiteの重にはない往復ます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top