2016-06-27 2 views
0

소수점 이하 4 자리까지 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 데이터 유형으로보고 싶습니다.

감사

+1

모든 숫자는 4 자리수의 정밀도를 가지고 있으며 4 자리수로 반올림하려합니다. 따라서 숫자에 이미 4 개의 정밀도가 있으므로 반올림이 발생하지 않습니다. – FLICKER

+0

다른 예제를 사용하면 차이점을 볼 수 있습니다. 모든 시나리오를 포함 할 수 없습니다. 죄송합니다 위의 쿼리에 대한 – sqlsleepless

+0

, 원하는 결과는 무엇입니까? 질문을 편집하고 예상되는 결과를 추가하면 질문에 대한 답을 얻는 데 도움이됩니다. – FLICKER

답변

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) 

결과가 경우에 정밀도 미만 4 (like 1.151)하다는 것을 21.1517

참고가 될 것입니다, 당신은 할 수 있습니다 결과에 후행 0을 추가하십시오.

테스트 :

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 ║ 
╚═══════════╩════════════╝ 
+0

대부분의 경우 작동하지만 126.2158과 같은 일부 인스턴스는 내 데이터베이스에서 126.2157을 반환합니다. – sqlsleepless

+0

또한 11.05에 해당하는 11.0499 – sqlsleepless

+0

126.2158을 반환 하시겠습니까? – FLICKER

1
FLOOR(DontRound * 10000)/10000 

그것을 납입 보관 에릭 연산. 당신이 만분의 일 (.0000)을 찾고 있기 때문에 그 수를 1 만분의 1로 곱한 다음 바닥을 본질적으로 가장 가까운 정수로 반올림하여 남은 소수를 제거한 다음 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 

또한 float는 계산을위한 다른 데이터 유형만큼 정확하지 않습니다. 당신은 당신의 어플리케이션/사용법에 따라 그것에 대한 연구를하고 싶을지도 모릅니다.

+0

이봐,이게 훨씬 더 좋은 해결책입니다! 왜 내 게시물을 답으로 표시 했습니까? 제 실수는 당신의 초기 질문에 대한 제 생각을 제한 시켰습니다. 나에게 좋은 교훈 : – FLICKER

+0

@FLICKER, 나는 마킹에 대해 너무 걱정하지 않는다. 나는 그가 당신을 먼저 얻고 솔루션이 효과를 발휘할 필요가 있다고 생각한다. 그래서 나는 그것에 당신을 추천한다! 다행히 도움이 될 것입니다. 건배 – Matt

관련 문제