2013-10-29 62 views
1

如何將十進制值拆分爲兩個十進制值。 如果小數部分小於.50或大於.50的十進制數應該以這樣的方式分割,即第一個no應該只以.00或.50結束。第二個值應該包含剩餘的因子值。在sql server中將十進制值拆分爲十進制數值

ex. 19.97 should return 19.50 & 0.47 
    19.47    19.00 & 0.47 

回答

3

你可以在「地板」到0.5的最高倍數由乘以2,呼籲FLOOR,然後除以2。從那裏只是減去從原來的價值得到的餘數。

DECLARE @test decimal(10,7) 
SELECT @test =19.97 

SELECT 
    FLOOR(@test * 2)/2 AS base, 
    @test - FLOOR(@test * 2)/2 AS fraction 

或減少重複

SELECT 
    base, 
    @test - base AS fraction 
FROM (SELECT FLOOR(@test * 2)/2 AS base) 
1
Declare @money money 

Set @money = 19.97 

Select convert(int,@money - (@money % 1)) as 'LeftPortion' 
     ,convert(int, (@money % 1) * 100) as 'RightPortion' 
+0

它完全劈裂的階乘部分.. –

0

你需要考慮的MODULO operator in SQL Server.

SELECT 
19.97 as myDecVal , 
19.97 % 0.5 AS decGreaterThan50,/*should return 0.47*/ 
19.97- (19.97 % 0.5) as roundedToNearestZeroPoint5 /*should return 19.50*/; 
+0

@DStanley:你確定嗎?我給出的鏈接表示否則:「模算術運算符可以在SELECT語句的選擇列表中使用,包括列名稱,數字常量或整數和貨幣數據類型類別的任何有效表達式或數字數據類型。」看到SQLFiddle演示:http://sqlfiddle.com/#!3/d41d8/23960 – 2013-10-29 15:23:50

+0

你是對的 - 我以爲我最近嘗試了其他的東西,它沒有奏效。我刪除了我的評論。 –

1

觀察到,加倍0.51,這是一個整數。這就導致了一個簡單的算法:

  • 雙數
  • 拆分成一個整體,一個小數部分使用floor(x)x-floor(x)
  • 將每個部分分別由2給你,你需要的結果。

讓我們把你的數字爲例:

19.97 * 2 = 39.94 
Whole part = 39, fractional part = 0.94 
Dividing each part by 2 individually, we get 
39/2 = 19.50 
0.94/2 = 0.47 

19.47 * 2 = 38.94 
Whole part = 38, fractional part = 0.94 
Dividing each part by 2 individually, we get 
38/2 = 19.00 
0.94/2 = 0.47