2016-05-26 10 views
1

テーブルにダブルフィールドがあります。私が二重パラメーターから小数部分を差し引くと、それは奇妙な問題を与えています。double型を使用しているときにmysqlで倍精度が正しく機能しない

私は0.06を差し引くことになると、テーブルでの私の量は

0.0080000000000001

更新のための私の単純なクエリは_amountダブルPARAMTER

ある

UPDATE 
    subscriber 
SET 
    balance = balance - _amount 

である0.068

です

これは従来のimplementaの一種である私は現時点で列の種類を変更することはできません。クエリ内で回避策が必要でした

+1

倍精度は近似値です。つまり、このようなことが起こる可能性があります。 – jarlh

+0

私はタイプを変更することができない瞬間に私はフロート/小数に行くことができます。上記の質問で回避策として実行できること –

+2

[浮動小数点数学は壊れていますか?](http://stackoverflow.com/questions/588004/is-floating-point-math-broken)の可能な複製 – user20160

答えて

2

あなたが何か試すことができますタイプ変更できない場合:

UPDATE 
    subscriber 
SET 
    balance = ((balance * 10000) - (_amount * 10000))/10000 

ので、減算は使用しません小数を。

+0

1つの問題は1つの量がある。 0.998766の代わりに0.9987659999999999になります –

+1

@KamranShahidええ、回避策には限界がありますが、 '* 1000000'と'/1000000'を使用すると、指定した数値にも有効です。しかし、小数点以下の桁数が10-15を超える場合は、回避策が動作しない可能性があります。他のオプションは、減算の前に10進(10,5)に値をキャストすることです。 – artm

+0

私は試してみようキャスティング –

3

問題は何ですか? double precisionは、バイナリ表現を使用して小数値を近似する浮動小数点数です。

正確な数値が必要な場合は、固定小数点表現を使用します。そのような列はdecimalと宣言されます。推奨されていない浮動小数点数を使用して通貨値を格納し、特に

alter table change column balance decimal(10, 4); -- or whatever is appropriate 

:あなたはこの使用alter tableを変更することができます。

+3

彼は彼がタイプを変更することはできないと述べた.. – sagi

関連する問題