У меня в таблице есть следующий список Amount (float).

Amount
123
123.1
123.0123
123.789456

Как я могу узнать количество цифр после десятичной точки.

Дублировать?: Я проверил уже существующие сообщения, но нет правильного способа обработки чисел float with or without decimal part .

Результат

Amount      Result
123         0
123.1       1
123.0123    4
123.789456  6

ИЗМЕНИТЬ : Потратив некоторое время, я нашел относительно простой скрипт для решения этой проблемы. Мой ответ: ниже

1
Abdul Rasheed 4 Май 2016 в 13:13

6 ответов

Лучший ответ

Я нашел простой сценарий (относительно меня), чтобы справиться с этим.

ISNULL(NULLIF(CHARINDEX('.',REVERSE(CONVERT(VARCHAR(50), Amount, 128))),0) - 1,0)

Здесь ISNULL(NULLIF предназначен только для обработки числа с плавающей запятой без десятичной части. Если нет значений без десятичной части, то это очень просто

CHARINDEX('.',REVERSE(CONVERT(VARCHAR(50), Amount, 128))) -1 

Надеюсь, это будет вам полезно. Полный сценарий ниже

declare @YourTable table (Amount float)
insert into @YourTable
values(123),(123.1),(123.0123),(123.789456)

SELECT  ISNULL(NULLIF(CHARINDEX('.',REVERSE(CONVERT(VARCHAR(50), Amount, 128))),0) - 1,0)
FROM    @YourTable

SELECT  CHARINDEX('.',REVERSE(CONVERT(VARCHAR(50), Amount, 128))) -1 
FROM    @YourTable
2
Abdul Rasheed 4 Май 2016 в 12:18

Поскольку было сказано, что это дубликат этого вопроса - SQL Server как получить десятичные цифры типа денег? - у меня нет другого выбора, чтобы ответить здесь.

/* Assumes money data type is passed in and therefore caters for overflow */
CREATE FUNCTION dbo.CountDecimalPlaces (@value decimal(30,4))  
RETURNS int
AS  
BEGIN 
    DECLARE @part decimal(30,4);
    SET @part = ABS(@value - CAST(@value as bigint));
    RETURN LEN(FORMAT(@part, '0.00##'))-2
END
0
Hassan Voyeau 8 Окт 2018 в 14:24

И еще один способ:

SELECT  Amount,
        CASE WHEN deci = 0 THEN 0 ELSE LEN(deci) END AS Result
FROM (
    SELECT  Amount,
            TRY_CAST(REVERSE(REPLACE(Amount - TRY_CAST(Amount as int),'0.','')) as int) as deci
    FROM (VALUES
    (123),
    (123.1),
    (123.0123),
    (123.789456)
    ) as t (Amount)
) as t

Выход:

Amount      Result
123.000000  0
123.100000  1
123.012300  4
123.789456  6
0
gofr1 4 Май 2016 в 12:28

Этот код вам обязательно поможет.

SELECT Amount,
       LEN(SUBSTRING(CAST(Amount as VARCHAR),CHARINDEX('.',CAST(Amount as VARCHAR))+1,LEN(Amount)))  Result
FROM [Your Table Name]
0
Arulkumar 4 Май 2016 в 10:40

Абдул Спасибо, что указал на мою ошибку. Мне не было известно о специфическом поведении поплавка.

declare @t table(Amount float)
insert into @t values (123),(123.1),(123.0123),(123.789456)

Вот видите, эта строчка поможет,

select CONVERT (VARCHAR(50), amount,128) from @t

Полный сценарий,

select col ,case when len(col)>0 then len(col) else 0 end newcol from
(SELECT substring(REVERSE(CONVERT (VARCHAR(50), amount,128)),0,
charindex('.',REVERSE(CONVERT (VARCHAR(50), amount,128)))) col from @t)t4
1
KumarHarsh 5 Май 2016 в 05:08

Сделать это можно следующим образом:

< Сильный > QUERY

SELECT Amount, 
       CASE WHEN FLOOR(Amount) <> CEILING(Amount) THEN LEN(CONVERT(INT,CONVERT(FLOAT,REVERSE(CONVERT(VARCHAR(50), Amount, 128))))) ELSE 0 END AS Result
FROM YourTable

ВЫХОД

Amount      Result
123         0
123,1       1
123,0123    4
123,789456  6
3
Stanislovas Kalašnikovas 4 Май 2016 в 10:33