2013-07-14 35 views
6

我需要將數字截斷爲2個小數位,這基本上意味着 會截斷多餘的數字。將數字截斷爲指定的小數位

如:

2.919  ->  2.91 

2.91111 ->  2.91 

爲什麼?這是SQL服務器在存儲一定數量的特定精度時正在執行的操作。例如,如果列是十進制(8,2),並且您嘗試 插入/更新9.1234的數字,則3和4將被截斷。

我需要在c#代碼中完成同樣的事情。

,我能想到這樣做的唯一可行方法之一:

  1. 使用stringformatter「打印」出來只有 小數點後兩位,然後將其轉換爲十進制, 如:

    decimal tooManyDigits = 2.1345 
    
    decimal ShorterDigits = Convert.ToDecimal(tooManyDigits.ToString("0.##")); 
    
    // ShorterDigits is now 2.13 
    

    我不是很滿意這一點,因爲它涉及到字符串,然後 另一個字符串轉換成十進制這似乎有點瘋狂。

  2. 使用Math.Truncate(只接受的整數),所以我 可以乘以100它,截斷,然後乘以100除以例如:

    decimal tooLongDecimal = 2.1235; 
    
    tooLongDecimal = Math.Truncate(tooLongDecimal * 100)/100; 
    

    我也不滿意這是因爲如果tooLongDecimal是0, 我會得到除以0的錯誤。

當然有更好的+更簡單的方法!有什麼建議麼?

+2

'0/100'不通過0錯誤分頻。它是'0',這是你所期望的。 – xbonez

+0

(0 * 100)/ 100 = 0 –

+0

@sehe truncate!= round –

回答

5

你自己回答了問題;似乎你只是誤解了零分的意思。要做到這一點,正確的方法是倍增,截斷,然後devide,像這樣:

decimal TruncateTo100ths(decimal d) 
{ 
    return Math.Truncate(d* 100)/100; 
} 

TruncateTo100ths(0m);  // 0 
TruncateTo100ths(2.919m); // 2.91 
TruncateTo100ths(2.91111m); // 2.91 
TruncateTo100ths(2.1345m); // 2.13 

沒有被零除這裏,只有100師,這是完全安全的。

+0

大壩你打我:)只是寫這個相同的math.truncate例子大聲笑+1。 – terrybozzio

0

使用decimal.ToString('0.##')規定四捨五入:

1.119M.ToString("0.##") // -> 1.12 

(是的,可能應該是一個評論,但它很難爲這樣到井)

3

先前提供的數學解決方案很容易受到大的數字和/或大量小數位的溢出。考慮代替以下擴展:

[System.Runtime.CompilerServices.Extension()] 
public static decimal TruncateDecimal(decimal d, int decimals) 
{ 
    if (decimals < 0) 
     throw new ArgumentOutOfRangeException("decimals", "Value must be in range 0-28."); 
    else if (decimals > 28) 
     throw new ArgumentOutOfRangeException("decimals", "Value must be in range 0-28."); 
    else if (decimals = 0) 
     return Math.Truncate(d); 
    else { 
     decimal integerPart = Math.Truncate(d); 
     decimal scalingFactor = d - integerPart; 
     decimal multiplier = Math.Pow(10, decimals); 

     scalingFactor = Math.Truncate(scalingFactor * multiplier)/multiplier; 

     return integerPart + scalingFactor; 
    } 
} 

用法:

decimal value = 18446744073709551615.262626263m; 
value = value.TruncateDecimal(6); 
相關問題