2013-07-14 36 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); 
相关问题