Мне нужно разделить 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
Как я могу этого добиться?
select cast(100*3/5 as decimal(5,2))/100
... я всегда думал, что это будет более эффективно, поскольку он делает только одно заклинание ... понятия не имею, основано ли это понятие на фактах. никогда не делал никаких тестов производительности
Хотя, как уже отмечалось, вы не получите 0.66
из этого расчета, несмотря ни на что, вы уже сами наткнулись на ответ: приведите конечный результат к желаемой точности, например. SELECT CONVERT(DECIMAL(3, 2), 3.0 / 5)
. (И обратите внимание, что 3.0
— это нетFLOAT
, но DECIMAL(2, 1)
. 3e0
будет FLOAT
.)
Если вы хотите .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)
.
Когда мы делим, мы можем использовать целое число, которое даст целочисленный результат, или десятичное число путем добавления десятичной точки (с нулем или без него), что даст десятичный результат с количеством знаков после запятой, определяемым форматом, или с плавающей запятой, добавив букву 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 Спасибо за исправление. Я изменил свое объяснение.
3/5 = 0,6000, так как же получить 0,66?