проблема с плавающей точностью sql

#sql #apache-spark #precision

#sql #apache-spark #точность

Вопрос:

У меня есть таблица fruit_df_sql, подобная этой

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

Я хочу сгенерировать процент каждой строки, но когда я суммирую процентный столбец, я не смог получить 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%. Я думаю, это потому, что деление и раунд приводят к проблеме с плавающей точностью. Пожалуйста, помогите. Спасибо.

Комментарии:

1. Это происходит с процентами. Это не особенно легко исправить.

2. для меня это нормально, каков ваш тип данных fruit_number?? я думаю, что это, должно быть, поплавок.

3. это значение int или long

4. когда-нибудь это может быть 100.01, это очень раздражает

5. Что такое СУБД?

Ответ №1:

Это нормально, round «преобразует» число, поэтому вы не можете ожидать, что в конце будет такая же сумма.

Ответ №2:

Попробуйте округлить его до 0 десятичных знаков.

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

Комментарии:

1. Я должен сохранить как минимум 2 десятичных знака.

2. Требуется ли вашей системе значение с плавающей запятой? если нет, вы могли бы изменить тип своего поля на decimal(10,2) — 10, что означает точность, и 2 для знаков после запятой.

3. Итак, мой входной fruit_number — целое число, bigint, мой вывод — процент, и мне нужно сохранить 2 десятичных знака, например 9,70%, 0,10%, 0,01%

4. Попробуйте использовать float тип данных в вашем fruit_number . Он больше справляется с точностью. Int используется для чисел без десятичных знаков.