2017-02-02 3 views
-1

Я пытаюсь преобразовать значение float в строковое значение с точностью до 2 десятичных чисел, используя функцию STR. Хорошо работает, но я получаю неправильный номер при попытке конвертировать значение 1,525. Я должен получить 1.53, вместо этого получим 1.52.SQL Float to VARCHAR using STR

Does not work 
Select rtrim(ltrim(Str(1.525, 10,2)))  
1.52 

Works for these  
Select rtrim(ltrim(Str(1.225, 10,2)))  
1.23 

Select rtrim(ltrim(Str(1.325, 10,2)))  
1.33 

Select rtrim(ltrim(Str(1.515, 10,2)))  
1.52 

Select rtrim(ltrim(Str(1.535, 10,2))) 
1.54 

UPDATE

Я использовал FORMAT(floatValue, 'N2') и это правильно работает. Любые комментарии об использовании этой функции, которые поддерживаются в 2012 году. Также второй аргумент можно построить динамически для поддержки различной точности.

+0

Какую версию SQL Server вы используете? Я получаю разные результаты, чем те, которые вы опубликовали с использованием 2008. –

+1

Почему вы используете 'FLOAT'? 'SELECT CONVERT (десятичный (12,2), '1.525');' –

+0

FLOAT не является точным - вы можете использовать типы NUMERIC или DECIMAL, если хотите точный – Hogan

ответ

1

Если ваша цель - преобразовать строку в числовой тип (округляется до двух десятичных знаков), а затем сделать что-то еще с ней, я бы использовал CAST() (или CONVERT()) 100% времени, возможно с ROUND() и другими функциями, но в вашем случае точность, используемая с CAST(), делает наше округление для нас.

Вот альтернативная форма запроса проблемы:

Select cast(cast('1.525' as numeric(10, 2)) as varchar(11)); 
-- returns '1.53' 
-- note that I don't really have to recast it as a varchar, 
--  but that's what type your example query would return, 
--  so I tried to match that 

Почему именно вы настаивали на использовании STR() для этого?

+0

Я использую STR, потому что точность является динамической, RTRIM (LTRIM (STR (@value, 102, ISNULL (@precision, 2)))). В любом случае, ваше решение по-прежнему дает неверный ответ 1.52, поскольку первоначально это значение типа float. Я пробовал округлить, и это не точно. Между, я подал в суд на SQL Server 2012 – ken

+0

Что-то, что нужно знать о https://siderite.blogspot.com/2014/04/converting-float-values-to-string-in-t.html#at3243721726 – ken

+1

@ken in в вашем примере вы не использовали float, вы использовали строку. Я вижу в вашем вопросе, где вы говорите, что это поплавок. Почему бы вам не изменить свои примерные запросы, чтобы показывать значения float вместо строк? Даже 'cast ('1.525' как float)' будет более представительным, чем просто '' 1.525''. – SlimsGhost