Целочисленное деление округляется до 2 знаков после запятой в SQL Server

Мне нужно разделить 2 целых числа, и результат должен быть округлен до 2 знаков после запятой. Реальные цифры выглядят так:

Select 3/5

Чтобы добиться округления до 2 знаков после запятой, числитель умножается на число с плавающей запятой:

select round(3.0 / 5 , 2)

Пробовал отбрасывать оба числа как десятичные числа следующим образом:

select round ( CAST (3 as decimal(3,2)) /  CAST (5 as decimal(3,2)) , 2)

Но результат содержит более 2 знаков после запятой.

Ожидаемый результат:

0.60

Как я могу этого добиться?

3/5 = 0,6000, так как же получить 0,66?

GuidoG 17.03.2022 14:02
select cast(100*3/5 as decimal(5,2))/100 ... я всегда думал, что это будет более эффективно, поскольку он делает только одно заклинание ... понятия не имею, основано ли это понятие на фактах. никогда не делал никаких тестов производительности
David784 17.03.2022 14:04

Хотя, как уже отмечалось, вы не получите 0.66 из этого расчета, несмотря ни на что, вы уже сами наткнулись на ответ: приведите конечный результат к желаемой точности, например. SELECT CONVERT(DECIMAL(3, 2), 3.0 / 5). (И обратите внимание, что 3.0 — это нетFLOAT, но DECIMAL(2, 1). 3e0 будет FLOAT.)

Jeroen Mostert 17.03.2022 14:05

Если вы хотите .66~, то это будет 2/3, 4/6 и т. д. Также ROUND не меняет масштаб decimal согласно документация. Если вы уменьшите значение ROUND до 2 знаков после запятой, вы получите 1.23456, потому что значение все равно будет 1.23000. Если вы специально хотите изменить масштаб decimal(6,5), то decimal/CONVERT его. CAST = CONVERT(decimal(3,2),4.0 / 6), 0.67 = ROUND(4.0 / 6,2).

Larnu 17.03.2022 14:07
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
4
51
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Когда мы делим, мы можем использовать целое число, которое даст целочисленный результат, или десятичное число путем добавления десятичной точки (с нулем или без него), что даст десятичный результат с количеством знаков после запятой, определяемым форматом, или с плавающей запятой, добавив букву e, которая будет использовать количество значащих десятичных разрядов без завершающих нулей. Следующая тестовая схема демонстрирует разницу между ними.

Мне кажется, что ROUND(2e/3,2) — это самый краткий способ получить 2 знака после запятой.

SELECT 
  3e/5 FloatingPoint,
  3./5 DecimalDivision,
  CONVERT(DECIMAL(3,2), 3./5) DecimalDivision,
  Round(3e/5,2) RoundedFloat
FloatingPoint | DecimalDivision | DecimalDivision | RoundedFloat
------------: | --------------: | --------------: | -----------:
          0.6 |        0.600000 |            0.60 |          0.6
SELECT 
  2e/3 FloatingPoint,
  2./3 DecimalDivision,
  CONVERT(DECIMAL(3,2), 2./3) DecimalDivision,
  Round(2e/3,2) RoundedFloat
    FloatingPoint | DecimalDivision | DecimalDivision | RoundedFloat
----------------: | --------------: | --------------: | -----------:
0.666666666666667 |        0.666666 |            0.67 |         0.67

дб <> рабочий пример здесь

Добавление десятичной точки приводит к тому, что нет дает число с плавающей запятой. Это заблуждение естественно и устойчиво, но то, что вы получаете таким образом, является литералом DECIMAL, а значит, и делением двух величин DECIMAL. Литерал с плавающей запятой может быть сформирован с помощью экспоненциальной записи (2e). Следовательно, 2e / 3 является истинным FLOAT (и не требует дальнейшего преобразования). Также обратите внимание, что CAST и CONVERT работают с любым типом; CONVERT(DOUBLE PRECISION, ... И CAST(... AS FLOAT) — это одно и то же, поэтому здесь нет необходимости смешивать и сочетать.

Jeroen Mostert 17.03.2022 14:46

@Jeroen Mostert Спасибо за исправление. Я изменил свое объяснение.

Kendle 17.03.2022 15:13

Другие вопросы по теме