2014-01-24 156 views
-4

我想弄清楚什么是解析十进制值的最佳方法。我目前使用Math.Round,但似乎不适用于输入数据。将十进制数截断为一个十进制数

我希望能够得到整数部分,然后小数点后面的第一个数字。

var value = 25.987817685360218441503885773M; 
return Math.Round(value, 1); 

回报26但我想返回25.9

+7

您确定要将'25.987817685360218441503885773M'舍入为'26.9'吗?这不是多么圆润的作品。 – ekad

+4

你的意思是25.9吗?另外,您预计25.887会有多少?基本上,你只是想截断小数第一位后的数字,或者当四舍五入到下一个整数时是否需要特殊情况? –

+2

文档:http://msdn.microsoft.com/en-us/library/System.Math.Round(v=vs.110).aspx –

回答

3

假设你想“回合”到25.9而不是26.9,你必须手动。

var number = 25.9877; 
var rounded = Convert.ToDouble(Convert.ToInt32(number*10))/10; 

而且,当然,这不是舍入,这只是斩断小数。

+1

@Robert - 如果这是公认的答案, 25.9',而不是'26.9',那么请编辑您的帖子以反映这一点。 – mbeckish

+0

人保持变化我的结果我的意思是25.9 – Robert

+0

这轮到'26'? 'Convert.ToInt32'轮。 – flindeberg

0

您正舍入到小数点后第一位,但向上舍入为25.98。这意味着8> = 5并且使得9变成0并且将1移到5.即5 + 1。因此,你越来越26.

1

你正在四舍五入,最后会明显变圆。你想要做的是截断数字。这里,将完成一个方法,你想要什么:

public decimal TruncateDecimal(decimal value, int precision) 
{ 
    decimal step = (decimal)Math.Pow(10, precision); 
    int tmp = (int)Math.Truncate(step * value); 
    return tmp/step; 
} 
2

编辑:

Math.Round有出过载:

System.Math.Round (n, 2, MidpointRounding.ToEven); 

Math.Round Method

0

由于有至少据我所知,这里没有任何可行的解决办法,这是OP所需要的。

// .NET has no build in power function for decimals 
decimal Pow(decimal value, int exp) 
{ 
if (exp < 0) 
    return 1/Pow(value, -exp); 

if (exp == 0) 
    return 1; 
else if (exp % 2 == 0) 
    return Pow(value * value, exp/2); 
else return 
    value * Pow(value, exp - 1); 
} 
// Rounds a number to decimals decimals, ie 1 => 1 decimal, -2 => whole hundreds 
public decimal Truncate(decimal number, int decimals) 
{ 
var factor = 1/Pow(10, decimals); 
return number - (number % factor); 
} 

请记住,虽然这不是舍入,但这是一些奇怪的截断形式。

相关问题