2016-10-20 10 views
0

私はこのSQL float精度の問題

 +------+------------+ 
    | fruit|fruit_number| 
    +------+------------+ 
    | apple|   20| 
    |orange|   33| 
    | pear|   27| 
    | melon|   31| 
    | plum|   8| 
    |banana|   4| 
    +------+------------+ 

のようなテーブルfruit_df_sql私は、各行のパーセンテージを生成する必要がありますが、私は割合欄を合計したとき、私は100%を取得できませんでした

select fruit, round(fruit_number/123*100,2) as cnt_percent 
    from fruit_df_sql 
    order by cnt_percent desc 

私はcnt_percentの列を合計した場合、私はこの

+----------------+ 
    |sum(cnt_percent)| 
    +----------------+ 
    |   99.99| 
    +----------------+ 

ない100%を得ました。分割とラウンドが浮動小数点精度の問題をもたらすからだと思います。助けてください。ありがとう。

+0

これはパーセントで発生します。修正するのは特に簡単ではありません。 –

+0

あなたのfruit_numberデータ型は何ですか?私はそれが浮動しなければならないと思う。 –

+0

intまたはlong – newleaf

答えて

0

を0小数点以下に切り捨ててください。

select fruit, round(fruit_number/123*100,0) as cnt_percent 
from fruit_df_sql 
order by cnt_percent desc; 
+0

私は少なくとも2小数を保持する必要があります。 – newleaf

+0

システムに浮動小数点値が必要ですか?もしそうでなければ、フィールドの型を '10進数(10,2)'に変更することができます - 10は精度を表し、2は小数点以下を表します。 – GNMercado

+0

私の入力fruit_numberはinteger、bigint、出力はパーセンテージで、9.70%、0.10%、0.01%のような2小数点以下を保持する必要があります – newleaf