c#为xx.5四舍五入

c#为xx.5四舍五入,c#,rounding,C#,Rounding,为我的应用程序编写一个扩展方法并指定精度是一个好主意,还是有任何其他好主意或其他方法来实现预期的结果 由于Convert.ToInt32 to truncate的行为,我正在执行下面的之类的操作,以实现预期的结果 注意:应用程序要求百分比为整数,而不是小数例如50.50是51而不是50.5,TotalScore是其他小数(分数)的集合,为了准确计算百分比,我希望任何xx.5四舍五入到十位 例如: '0.8149863*100=81.50~82' '0.2021111*100=20.21~20'

为我的应用程序编写一个扩展方法并指定精度是一个好主意,还是有任何其他好主意或其他方法来实现预期的结果

由于Convert.ToInt32 to truncate的行为,我正在执行下面的之类的操作,以实现预期的结果

注意:应用程序要求百分比为整数,而不是小数例如50.50是51而不是50.5,TotalScore是其他小数(分数)的集合,为了准确计算百分比,我希望任何xx.5四舍五入到十位

例如:

'0.8149863*100=81.50~82'
'0.2021111*100=20.21~20'
'0.5889681*100=58.89~59'

注意:数学的行为。当接近“0”或“10”时,四舍五入与预期一样,但上述双舍五入是专门为“xx.5”进行的(适用于其他情况)转换。ToInt32使用截断,在获得准确结果时不产生任何费用

我非常需要上面的行为,所以决定在下面写一个扩展名,以便在计算十进制百分比时调用扩展名,并期望返回整数值

    /// <summary>
    /// 
    /// </summary>
    /// <param name="value"></param>
    /// <param name="count"></param>
    /// <param name="decimals">Number of decimal places </param>
    /// <returns></returns>
    public static int ToIntPercentageWithPrecision(this decimal value , int count , int decimals )
    {
        return Convert.ToInt32((Math.Round(Math.Round(value * 100, decimals, MidpointRounding.AwayFromZero), MidpointRounding.AwayFromZero)) / count);
    }
//
/// 
/// 
/// 
/// 
///小数位数
/// 
公共静态整数到整数百分比精度(此十进制值、整数计数、整数小数)
{
返回Convert.ToInt32((Math.Round(Math.Round(值*100,小数,中点舍入.AwayFromZero),中点舍入.AwayFromZero))/count);
}

然而,上述解决方案不可读,看起来很混乱。需要一个干净、可读且准确的解决方案。

使用如下扩展方法如何:

public static class RoundingExtentionMethod
{
    public static int ToIntegerPercentage(this decimal d)
    {
        return Convert.ToInt32(Math.Ceiling(Math.Round (d * 100, 2, MidpointRounding.AwayFromZero)));
    }
}
然后你可以打电话

var result = (0.8149863M * 100).ToIntegerPercentage ();

扩展方法中的表达式:

 return Convert.ToInt32((Math.Round(Math.Round(value * 100, decimals, MidpointRounding.AwayFromZero), MidpointRounding.AwayFromZero)) / count);
应该给你和做同样的事情:

 return Convert.ToInt32(Math.Round(value * 100, MidpointRounding.AwayFromZero) / count);
我不知道为什么在函数中有“decimals”参数,因为用户输入的任何小数都会被外部舍入截断。您真的不需要为此扩展,只需简单地说

Math.Round(value * 100, MidpointRounding.AwayFromZero)

只要你想把像.8149863这样的分数转换成81%。将8149863四舍五入到82%在技术上是不正确的。接近81%。您两次四舍五入的技巧确实将其四舍五入到82,但这并不是更接近的百分比。

基本上,对于小数点为0.495或更高的任何东西,您都在四舍五入。因此,您可以通过向值添加0.505(1-0.495)来简化舍入,然后只转换为
int
(相当于截断或取值的下限)


你为什么要绕两圈?为什么不一次四舍五入到0位小数?还有,哪个部分不可读和/或不易理解?将内联表达式拆分为单独的行来解释步骤是否更好?@DStanley感谢您的回答,四舍五入两次有点难看。如果我使用舍入到0小数,那么0.8149863*100=81,但我期望82@AmitPore为什么,81.49863比82.return(int)(值+0.5m)更接近81,也许对眼睛更容易。预计0.8149863分中有82分意味着杯子已经满了一半以上。添加任何你认为半满。似乎需要转换<代码> 8149863 < /代码>到<代码> 82% < /代码>,而不是<代码> 81% < /代码>。因此有点奇怪的舍入。@CharlesMager-是的,我正在添加一个注释,舍入到81并不是真正正确的舍入。我不确定我们是否有足够的上下文可以只说“您的要求是错误的”。@CharlesMager-当然,您是对的。这就是为什么从一开始我就说“技术上不正确”。他可能不想对适当的四舍五入技术性。在这种情况下,他可以忽略我的答案?OP正在使用
decimal
而不是
double
。然后扩展decimal。因为如果每次使用扩展方法时都要乘以100,那么这可能属于扩展方法。或者这样想-扩展方法是将分数转换为整数百分比。为什么在调用方法之前要求调用代码执行*100?当然,这个答案在调用代码中乘以100,然后在方法中再乘以100,所以它似乎不正确。@在您的代码中,在AgapwIesu的注释中,GeorgeLica不存在。它缺少的TotalCount,hope(int)不会截断。我会试试的thanks@AmitPore
(int)
将截断,但通过添加0.505,它应将其增加到您希望截断的值。所以对于0.81498,它乘以81.498,然后加上82.003,然后截断到82。
Math.Round(value * 100, MidpointRounding.AwayFromZero)
public int? CurrentScore
{
    get
    {
        if (TotalCount > 0)
        {
            return (int)((TotalScore * 100) + 0.505m);
        }
        else
        {
            return null;
        }
    }
    set
    {
        //Due to the fact WCF will fail with ReadOnly properties.
    }
}