2016-11-08 4 views
0

と同じ値を処理する、タイプ倍精度:PostgreSQLは、それぞれが値「110」を含むので、この例ではSQLは、列「quantidade」および「quantidade_reservada」を有する行を返す異なる

...

"quantidade"が "quantidade_reservada"に等しくない場合にのみ結果を取得する条件を適用しようとすると、PostgreSQLは数値を区別していないようです。

110と110の違いは?

+4

倍精度の問題?何とか小数を表示できますか? – jarlh

+3

'double'は**近似**データ型であり、多くの不愉快な驚きの対象です。詳細はこちら:http://floating-point-gui.de/あなたが保存した値と同じ値を取り出して比較したい場合は、代わりに 'decimal'を使用してください。 –

答えて

0

Floating-Point Types

データ型実数と倍精度は、可変精度数値型不正確です。

数字の価値観やpgAdminでで自分の表現の違いがあり

where round(quantidade::numeric, 2) != round(quantidade_reservada::numeric, 2) 

Arbitrary Precision Numbers

0

を試してみてください。
pgAdminに表示されているものは、値を2桁に丸めて表示します。

with t (x,y) as (select 102/300::numeric(23,20),101/300::numeric(23,20)) 

select x 
     ,y 
     ,case when x=y then 'Y' else 'N' end  as is_equale 
     ,x-y          as "x-y" 
     ,(x-y)*1000        as "(x-y)*100" 

from t 
; 

pgAdminで結果:

x  y  is_equale x-y  (x-y)*100 
---- ---- --------- ---- --------- 
0.34 0.34 N   0.00 3.33 

DbVisulizer結果:

x      y      is_equale x-y      (x-y)*100 
---------------------- ---------------------- --------- ---------------------- ---------------------- 
0.34000000000000000000 0.33666666666666666667 N   0.00333333333333333333 3.33333333333333333000 
+0

これは質問に対する答えを提供しません。批評をしたり、著者の説明を求めるには、投稿の下にコメントを残してください。 - [レビューから](/レビュー/低品質の投稿/ 14227751) –

+0

@ruffp、そうです。 POは、等しい値であると思われるものが等しくないものとして扱われることを理解していませんでした。 –

+0

私はこれを正解とは言いませんが、コメントです。他の答えを見て、なぜこれが機能しないのか(ドキュメントを指している)、OPの質問を解決する方法(何らかの編集/書式の改善が必要な場合でも)について説明してください。 –

関連する問題