2012-04-16 2 views
-2

Использование SQL Server 2000Как уменьшить длину поплавка

Я хочу, чтобы уменьшить длину десятичной

Запрос

Select 23/12 as total 

Выход показывает, как 1.99999999999

Я не хочу чтобы округлить значение, я хочу, чтобы diplay вот так 1.99

Пробовал запрос

Select LEFT(23/12, LEN(23/12) - 3) as total 

Этот запрос работает, только если есть десятичное значение, как 12.444444, но если итог одна цифра означает, как 12 или 4 или 11 ...., я получаю сообщение об ошибке во время выполнения ,

Как это сделать.

Нужна Запрос Помощь

+0

Почему вы используете строковые функции для числа? –

+0

duplicate http://stackoverflow.com/questions/1248843/formatting-numbers-in-sql-server – skajfes

+0

Как вы получаете 23/12, чтобы показать 1.9999 ... в первую очередь? - он должен показать 1.91666666666667. Это может означать, что есть что-то странное, разрешение которого может сделать форматирование более прямым (как вы могли бы округлить, а не усекать). –

ответ

2

Существует очень простое решение. Вы можете найти его в BOL. Round имеет необязательный третий аргумент, который является круглым. Значения округлены или обрезаны.

КРУГЛЫЙ numeric_expression, длина [функция])

...

функция Является ли тип операции для выполнения. функция должна быть tinyint, smallint или int. Когда функция опущена или имеет значение 0 (по умолчанию), числовое выражение округляется. Когда задано значение, отличное от 0 , numeric_expression усекается.

Так вобще

Select ROUND(cast(23 as float)/12, 2, 1) as total 

Это дает 1,91. Заметьте, если вы действительно видели 1.999 - что-то действительно не так с вашим компьютером. 23/12 = 1,916666666 (до бесконечности). Вам нужно указать одно из чисел как float, поскольку sql предполагает, что они являются целыми числами и в противном случае выполняют целочисленное деление. Разумеется, вы можете использовать их как float, но до тех пор, пока один плавает, другой тоже будет преобразован.

1

Не очень элегантно, но работает для всех случаев: ''

Выбор CONVERT (поплавок, LEFT (CONVERT (NVARCHAR, 23,0/12,0), CHARINDEX (, CONVERT (NVARCHAR , 23,0/12,0)) + 2)) в качестве общего

скалярной функции

-- Description: Truncate instead of rounding a float 
-- SELECT dbo.TruncateNumber(23.0/12.0,2) 
-- ============================================= 
CREATE FUNCTION TruncateNumber 
(
    -- Add the parameters for the function here 
    @inFloat float, 
    @numDecimals smallint 
) 
RETURNS float 
AS 
BEGIN 
    IF (@numDecimals < 0) 
    BEGIN 
     SET @numDecimals = 0 
    END 
    -- Declare the return variable here 
    RETURN CONVERT(float,LEFT(CONVERT(nvarchar, @inFloat),CHARINDEX('.',CONVERT(nvarchar, @inFloat)) + @numDecimals)) 

END 
GO 
+0

Truncate - это встроенный вариант раунда, не нужно изобретать колесо здесь. –

+0

Ну, это довольно неловко ... спасибо. –

Смежные вопросы