#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 используется для чисел без десятичных знаков.