修剪浮点值最多4位小数

时间:2016-06-27 23:02:35

标签: sql sql-server-2008

我有一个要求,它需要显示最多4个小数位的4个值。使用圆函数时,它不会向上舍入。以下是我尝试过的一些功能。但是无法让它发挥作用。如果我遗漏了任何东西,请告诉我。

    SELECT  CAST(0.1173 AS FLOAT) AS DontRound
    INTO #TEMP
    UNION ALL
    SELECT CAST(12.1373 AS FLOAT) AS DontRound
    UNION ALL
    SELECT CAST(0.7065 AS FLOAT) AS DontRound
    UNION ALL
    SELECT CAST(0.7065 AS FLOAT) AS DontRound
    UNION ALL
    SELECT CAST(0.3534 AS FLOAT) AS DontRound
    UNION ALL
    SELECT CAST(0.4534 AS FLOAT) AS DontRound
    UNION ALL
    SELECT CAST(0.5732 AS FLOAT) AS DontRound
    UNION ALL
    SELECT CAST(0.6487 AS FLOAT) AS DontRound   

    select DontRound,Round(DontRound,4,1)  
   , CAST(left(CONVERT(VARCHAR(50),DontRound,128),   charindex('.',CONVERT(VARCHAR(50),DontRound,128)) + 4) AS FLOAT) 
from #temp

我希望看到float数据类型的输出,如果可能的话。

由于

2 个答案:

答案 0 :(得分:1)

FLOOR(DontRound * 10000)/10000

保持数字运算。将它乘以10,000,因为你正在寻找万分之一(.0000)然后将底层基本上向下舍入到最接近的整数整数,从而将剩余的小数除去,然后再将其除以10,000以转换回所需的十进制值。

;WITH cte AS (
    SELECT  CAST(0.1173 AS FLOAT) AS DontRound
    UNION ALL
    SELECT CAST(12.1373 AS FLOAT) AS DontRound
    UNION ALL
    SELECT CAST(0.7065 AS FLOAT) AS DontRound
    UNION ALL
    SELECT CAST(0.7065 AS FLOAT) AS DontRound
    UNION ALL
    SELECT CAST(0.3534 AS FLOAT) AS DontRound
    UNION ALL
    SELECT CAST(0.4534 AS FLOAT) AS DontRound
    UNION ALL
    SELECT CAST(0.5732 AS FLOAT) AS DontRound
    UNION ALL
    SELECT CAST(0.6487 AS FLOAT) AS DontRound
    UNION ALL
    SELECT CAST(1.151785 AS FLOAT) AS DontRound
    UNION ALL
    SELECT CAST(126.2158 AS FLOAT) AS DontRound
)

SELECT *, FLOOR(DontRound * 10000)/10000
FROm
    cte

另请注意,浮点数与计算的其他数据类型一样精确。您可能希望根据您的应用/用途进行一些研究。

答案 1 :(得分:0)

这是您需要使用的公式:

declare @num float = 21.151785
select cast(floor(@num) as varchar(100)) + 
    substring(cast(@num - floor(@num) as varchar(100))
              , charindex('.', cast(@num - floor(@num) as varchar(100)), 1)
              , 5)

结果将为21.1517

请注意,如果精度小于4 (like 1.151),您可能希望在结果中添加尾随零。

<强>测试

SELECT  CAST(0.11735 AS FLOAT) AS DontRound
INTO #TEMP
UNION ALL
SELECT CAST(12.13738 AS FLOAT) AS DontRound
UNION ALL
SELECT CAST(0.70651 AS FLOAT) AS DontRound
UNION ALL
SELECT CAST(0.70656 AS FLOAT) AS DontRound
UNION ALL
SELECT CAST(0.35342 AS FLOAT) AS DontRound
UNION ALL
SELECT CAST(0.45347 AS FLOAT) AS DontRound
UNION ALL
SELECT CAST(0.5732 AS FLOAT) AS DontRound
UNION ALL
SELECT CAST(11.05 AS FLOAT) AS DontRound
UNION ALL
SELECT CAST(126.2158 AS FLOAT) AS DontRound
UNION ALL
SELECT CAST(0.6487 AS FLOAT) AS DontRound   

查询

select DontRound,
cast(floor(DontRound) as varchar(100)) + 
    substring(cast(DontRound - floor(DontRound) as varchar(100))
              , charindex('.', cast(DontRound - floor(DontRound) as varchar(100)), 1) 
              , 5) AS CutDecimal
from #TEMP

<强>结果

╔═══════════╦════════════╗
║ DontRound ║ CutDecimal ║
╠═══════════╬════════════╣
║   0.11735 ║     0.1173 ║
╠═══════════╬════════════╣
║  12.13738 ║    12.1373 ║
╠═══════════╬════════════╣
║   0.70651 ║     0.7065 ║
╠═══════════╬════════════╣
║   0.70656 ║     0.7065 ║
╠═══════════╬════════════╣
║   0.35342 ║     0.3534 ║
╠═══════════╬════════════╣
║   0.45347 ║     0.4534 ║
╠═══════════╬════════════╣
║    0.5732 ║     0.5732 ║
╠═══════════╬════════════╣
║     11.05 ║      11.05 ║
╠═══════════╬════════════╣
║  126.2158 ║   126.2158 ║
╠═══════════╬════════════╣
║    0.6487 ║     0.6487 ║
╚═══════════╩════════════╝