2017-09-09 6 views
1

私のデータベースには、ProfitとMonthのフィールドがあり、ProfitはDOUBLEタイプのテーブルがあります。SQL GROUP BYとDOUBLE VALUE属性

私は次のクエリを実行しています:私は私のデータベースだけな9.02や3.79のような2つの小数点とダブルスが含まれていますが、私が得る結果は

Profit    Month 
904953.49   1 
834431.1699999999 2 
925363.4200000018 3 

であることを確信している

SELECT SUM(profit) AS profit , Month 
        FROM general_Table 
        Where ID = '101' AND Year = '2017' 
        GROUP BY Month 

を小数点以下2桁の値しか入力されないので、小数点以下2桁を取得しないようにしてください。私の質問が間違っていると誰かが説明できますか?その後、

+2

https://dev.mysql.com/doc/refman/5.7/en/problems-with-float.htmlを読んで、** FLOATまたはDOUBLEを使用して通貨値のような正確な数値を格納するのをやめてください。 ** –

+1

[my 2013 tweet](https://twitter.com/billkarwin/status/347561901460447232)を参照してください:「FLOATを使用して通貨を保管するのを見たたびに、 #999.997634。ieee754jokes " –

答えて

0

私のデータベースは2つのだけ小数点とのダブルスが含まれてい

flo ating点数は実数の近似値です。ほとんどの実数は、浮動小数点形式を使って正確に表現することはできません。

10進数の通常の数値表現を使用しても、ほとんどの数値を正確に表すことはできません。例えば、1/3は、通常、0.33または0.333または0.333333333333と表されますが、小数点以下を何度入れても1/3ではありません。 1/3を浮動小数点としても正確に表現することはできません。

基数10で正確に表現できる数字のすべてを、浮動小数点として正確に表すことはできません。 0.2はそのような数値です。

"2小数点以下の桁"は、浮動小数点形式のためのものを意味しません。小数点ではなく、2進数表記を使用した値を表します。


数はお金を表すとき戻るあなたの質問に、誰かが数の小数点以下の桁数を気最も一般的な(そしておそらく唯一の)理由があります。

ほとんどのRDBMS-esは、金額を格納するように設計されたデータ型を提供します。それらは固定小数点数を使用して実装され、正確です。

MySQLでは、DECIMALタイプを使用してください。あなたができる最善のことはDECIMALに列の型を変更することです:

ALTER TABLE general_Table 
MODIFY COLUMN profit DECIMAL(9,2) 

宣言N桁と整数部(M-N桁)を含んM桁のDECIMAL(M,N)店舗数。

お金の保管に使用する場合、Nは通常2です。必要に応じてMの値を調整します。 DECIMAL(9,2)は、-9,999,999.99から+9.999.999,99までの金額を正確に表すことができます。

1

あなたはちょうど2つの小数点をしたい場合は、小数に変換します。

SELECT CAST(SUM(profit) as DECIMAL(9, 2)) AS profit , Month 
FROM general_Table 
WHERE ID = 101 AND Year = 2017 
GROUP BY Month; 

あなたは浮動小数点表現を使用して値を格納している場合は、その値が正確ではありません - あなたはあなたの結果に注意して。固定小数点表現(decimal/numeric)を使用して金額を保存することをお勧めします。データベースは十分な理由で小数点値を格納する2つの異なる方法をサポートしています。アプリケーションによっては正確な精度が必要なものもあれば、広範囲の値を表現できるものもあります。

出力のために、固定小数点repesentationに変換することができます。

+0

同じ結果が得られますか?私は、結果が最後の値をキャストするこの時点でより多くの小数点が初期値よりも大きいので、演算子の合計が演算子を加算していると思います。 –

+1

@ilkerKaya。 。 。あなたがそれを心配している場合は、合計の前にキャストを行うことができます。しかし、実際には、データの表現を 'decimal 'を使うように変更するべきです。クエリを修正しないで、データを修正してください。 –

0

あなたは丸め結果を丸め結果とROUND機能なしTRUNCATE機能を使用することができます

TRUNCATE(SUM(profit), 2) 

または:

ROUND(SUM(profit), 2)