More for fun, here is an alternative "solution", set to return six digits and the decimal separator.
😎
USE tempdb;
GO
SET NOCOUNT ON
/* Generate a set of numbers from 1 to
the value of @SAMPLE_SIZE
*/
DECLARE @SAMPLE_SIZE INT = 10;
DECLARE @TEST_SET TABLE (RID INT NOT NULL, FL_VAL FLOAT NOT NULL);
;WITH T(N) AS (SELECT N FROM ( VALUES (NULL),(NULL),(NULL),
(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL)) AS X(N))
,NUMS(N) AS (SELECT TOP(@SAMPLE_SIZE) ROW_NUMBER()
OVER (ORDER BY (SELECT NULL)) AS
N FROM T T1,T T2,T T3,T T4,T T5,T T6,T T7)
/* Generate floating point number test set */
INSERT INTO @TEST_SET(RID,FL_VAL)
SELECT
NM.N
,ABS(CHECKSUM(NEWID())) / POWER(10.0,ABS(CHECKSUM(NEWID())) % 11.0)
FROM NUMS NM
SELECT
TS.RID AS RID
,TS.FL_VAL AS FLOAT_VALUE
/* If there is a remainder after the division then
the number is too great
*/
,1 -SIGN(FLOOR(TS.FL_VAL / 100000)) AS IS_VALID
/* Return as string
*/
,STR(TS.FL_VAL,7,7) AS CHOPPED_STRING_7
FROM @TEST_SET TS
/* Uncomment the next line to filter only valid numbers */
--WHERE (1 -SIGN(FLOOR(TS.FL_VAL / 100000))) = 1
Sample results
RID FLOAT_VALUE IS_VALID CHOPPED_STRING_7
----------- ---------------------- ---------------------- ----------------
1 769388.178 0 769388
2 2.71267499 1 2.71267
3 176.762866 1 176.763
4 1949056 0 1949056
5 1300132.345 0 1300132
6 1.65171232 1 1.65171
7 0.913729839 1 0.91373
8 1338.032751 1 1338.03
9 70.206716 1 70.2067
10 1974091608 0 *******