SELECT CAST(height AS DECIMAL(18,0))/10
Edit: Как это работает под капотом?
Тип результата совпадает с типом обоих аргументов или, если они отличаются, определяется data type precedence table. Поэтому вы можете использовать любой аргумент для чего-то нецелого.
Теперь DECIMAL(18,0)
, или вы могли бы написать что то же самое только DECIMAL
, до сих пор вид целого типа, потому что по умолчанию масштаб 0
означает «нет цифр справа от десятичной точки». Таким образом, приведение к нему может в разных обстоятельствах хорошо работать для округления до целых чисел - противоположность тому, что мы пытаемся выполнить.
Однако у DECIMAL есть свои правила для всего. Они, как правило, нецелые, но всегда точные числа. Тип результата деления DECIMAL, который мы заставили произойти, is determined specially быть, в нашем случае, DECIMAL (29,11). Следовательно, результат разделения будет округлен до 11 мест, что не связано с делением на 10, но округление становится наблюдаемым при делении на 3. Вы можете контролировать количество округления, манипулируя шкалой левого операнда. Вы можете также округлить больше, но не меньше, разместив еще одну операцию ROUND или CAST вокруг всего выражения.
Идентичные механика управляет проще и приятнее решение в принятом ответе:
SELECT height/10.0
В этом случае тип делителя DECIMAL(3,1)
и тип результата DECIMAL(17,6)
. Попробуйте делить на 3 и наблюдать разницу в округлении.
Если вы просто ненавидите все эти разговоры о точностях и масштабах, и просто хотите SQL-сервер для выполнения всех вычислений в старой доброй двойной точности с плавающей точкой арифметики от некоторой точки, вы можете заставить это тоже:
SELECT height/CAST(10 AS FLOAT(53))
или что то же самое только
SELECT height/CAST (10 AS FLOAT)
+1 для первой части, но остерегайтесь второго примера. Этот «CONVERT» применяется после разделения и не может дать вам больше шести десятичных знаков, которые у вас уже есть. –
идеальное решение !! Наверное, сначала лучше получается! не так ли? – Diablo
@ Diablo Ну, вы можете проверить это, но я сомневаюсь, что вы заметите какую-либо разницу. В любом случае, если вам нужна конкретная точность/масштаб, сделайте это форматирование на своем прикладном уровне. –