LTRIM и RTRIM, усекающие число с плавающей запятой

#sql-server

#sql-сервер

Вопрос:

Я испытываю то, что я бы описал как совершенно неожиданное поведение, когда я передаю float значение через LTRIM или RTRIM :

 CREATE TABLE MyTable
(MyCol float null)

INSERT MyTable
values (11.7333335876465)

SELECT  MyCol, 
        RTRIM(LTRIM(MyCol)) lr, 
        LTRIM(MyCol) l, 
        RTRIM(MyCol) r 
FROM    MyTable
  

Что дает следующие результаты:

 MyCol              | lr      | l       | r
--------------------------------------------
11.7333335876465   | 11.7333 | 11.7333 | 11.7333
  

Я наблюдал такое же поведение на SQL Server 2014 и 2016.

Теперь я понимаю, что LTRIM и RTRIM следует просто удалить пробелы из значения, а не приводить его / усекать.

У кого-нибудь есть идея, что здесь происходит?


Просто чтобы объяснить предысторию этого. Я генерирую SQL-запросы, используя свойства набора C # POCOS (результаты будут использоваться для генерации хэша MD5, который затем будет сравниваться с эквивалентным значением из таблицы Oracle) и для удобства оборачивал каждый столбец с помощью LTRIM / RTRIM.

Комментарии:

1. Похоже, что оно приведено к строке, чтобы соответствовать требованиям функции. В этом нет ничего странного

2. почему вы все равно пытаетесь обрезать пробелы от float типа данных? Их никогда не будет. Это может применяться только к строковым представлениям.

3. Таким образом, вы получаете неожиданное поведение при использовании строковой функции со значением с плавающей запятой. Тогда не делайте этого.

4. @MartinSmith — Я добавил объяснение выше.

Ответ №1:

Возможно, вы можете использовать format() вместо этого

 Declare @F float = 11.7333335876465
Select format(@F,'#.##############')
  

ВОЗВРАТ

 11.7333335876465