我想弄清楚什么是解析十进制值的最佳方法。我目前使用Math.Round
,但似乎不适用于输入数据。将十进制数截断为一个十进制数
我希望能够得到整数部分,然后小数点后面的第一个数字。
var value = 25.987817685360218441503885773M;
return Math.Round(value, 1);
回报26
但我想返回25.9
。
我想弄清楚什么是解析十进制值的最佳方法。我目前使用Math.Round
,但似乎不适用于输入数据。将十进制数截断为一个十进制数
我希望能够得到整数部分,然后小数点后面的第一个数字。
var value = 25.987817685360218441503885773M;
return Math.Round(value, 1);
回报26
但我想返回25.9
。
假设你想“回合”到25.9而不是26.9,你必须手动。
var number = 25.9877;
var rounded = Convert.ToDouble(Convert.ToInt32(number*10))/10;
而且,当然,这不是舍入,这只是斩断小数。
@Robert - 如果这是公认的答案, 25.9',而不是'26.9',那么请编辑您的帖子以反映这一点。 – mbeckish
人保持变化我的结果我的意思是25.9 – Robert
这轮到'26'? 'Convert.ToInt32'轮。 – flindeberg
您正舍入到小数点后第一位,但向上舍入为25.98。这意味着8> = 5并且使得9变成0并且将1移到5.即5 + 1。因此,你越来越26.
你正在四舍五入,最后会明显变圆。你想要做的是截断数字。这里,将完成一个方法,你想要什么:
public decimal TruncateDecimal(decimal value, int precision)
{
decimal step = (decimal)Math.Pow(10, precision);
int tmp = (int)Math.Truncate(step * value);
return tmp/step;
}
由于有至少据我所知,这里没有任何可行的解决办法,这是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);
}
请记住,虽然这不是舍入,但这是一些奇怪的截断形式。
您确定要将'25.987817685360218441503885773M'舍入为'26.9'吗?这不是多么圆润的作品。 – ekad
你的意思是25.9吗?另外,您预计25.887会有多少?基本上,你只是想截断小数第一位后的数字,或者当四舍五入到下一个整数时是否需要特殊情况? –
文档:http://msdn.microsoft.com/en-us/library/System.Math.Round(v=vs.110).aspx –