У меня в таблице есть следующий список 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
ИЗМЕНИТЬ : Потратив некоторое время, я нашел относительно простой скрипт для решения этой проблемы. Мой ответ: ниже
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
Поскольку было сказано, что это дубликат этого вопроса - 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
И еще один способ:
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
Этот код вам обязательно поможет.
SELECT Amount,
LEN(SUBSTRING(CAST(Amount as VARCHAR),CHARINDEX('.',CAST(Amount as VARCHAR))+1,LEN(Amount))) Result
FROM [Your Table Name]
Абдул Спасибо, что указал на мою ошибку. Мне не было известно о специфическом поведении поплавка.
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
Сделать это можно следующим образом:
< Сильный > 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
Похожие вопросы
Связанные вопросы
Новые вопросы
sql
Язык структурированных запросов (SQL) - это язык запросов к базам данных. Вопросы должны включать примеры кода, структуру таблицы, примеры данных и тег для используемой реализации СУБД (например, MySQL, PostgreSQL, Oracle, MS SQL Server, IBM DB2 и т. Д.). Если ваш вопрос относится исключительно к конкретной СУБД (использует определенные расширения / функции), используйте вместо этого тег этой СУБД. Ответы на вопросы, помеченные SQL, должны использовать стандарт ISO / IEC SQL.