問題は、テーブルからビューに 2 つ以上の double を追加すると、正しい結果が得られる代わりに、約 10 桁以上の数字が追加されることです。たとえば、0.5+1.5=1.99999999998 または 5.5+8.5=14.0000000001 です。何か案は?(私はこれが一種の未熟な質問であることを知っており、9 年生の試験でそのようなものに対処しなければならなかったことを覚えていますが、当時どのようにそれを行ったかを思い出せません :P)
6 に答える
http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_format
それがあなたの後なら、この方法で数値をフォーマットできますか?
float または double として 1 と 1 を加算しても、結果は 2 になります。
0.5 + 1.5 が 2 以外になるとは信じがたいです。
これらの数値はすべて、2 進浮動小数点で正しく表すことができます。
あなたの例を信じないとは言いたくないのですが、信じません。:-)
ただし、1.1 などの数値では問題が発生する可能性があると思います。
なんで?1/10 は 2 進法の繰り返し小数になるからです。
問題は、浮動小数点数を 10 進表現と 2 進表現の間で変換しようとしたときに発生します。いくつかの数値は旅行を問題なくしますが、他の数値は概算にすぎません.
ただし、あなたの例が本当にそのように機能する場合、何が起こっているのかわかりません。知りたいです。
浮動小数点数は常に単なる近似値です。:-) 精度が重要な場合は、整数を使用する方法を見つけてください。
私の経験では、float/double の代わりに decimal データ型を使用すると、常に正確な結果が得られました。
この記事では、この問題についてよく説明しています。
簡単に言えば、浮動小数点数が非常に大きいか、または非常に小さいと、計算中に精度が失われる可能性があります。
浮動小数点型を扱う場合、整数を期待しないでください。
説明または解決策を探しているかどうかはわかりませんが、適切な説明へのポインターを既に取得しているため....
数値を整数のように動作させる必要がある場合は、整数を使用してください。有限の精度 (つまり、金額を表すフィールドの場合、小数点以下 2 桁) が必要な場合は、とにかく整数として格納しますが、小数点以下を取り除くために必要な係数 10 を掛けます。データベースを引き戻すときに同じで割ります。
したがって、3.99 ドルのウィジェットを表す場合は、399 を WIDGET.cost フィールドに入力します。
それがあなたの状況に当てはまるかどうかはわかりません。しかし、一般的な経験則では、浮動小数点数は常に単なる近似値です。:-) 精度が重要な場合は、整数を使用する方法を見つけてください。