仅使用ToString舍入到小数位的中点

时间:2017-11-16 15:38:34

标签: c# rounding tostring displayformat

我知道C#有一些选项可以使用ToString()方法中的某些扩展逻辑来格式化十进制数,例如。

double d1 = 1.3333;
double d2 = 1.6666;
string d1Str = d1.ToString("#0.00"); // 1.33
string d2Str = d2.ToString("#0.00"); // 1.67

太棒了,我的号码四舍五入到小数点后第二位。但是如果我想要转到0.05而不是0.01的步骤呢?有没有办法以类似的方式使用ToString()方法将值舍入到给定的步长(例如0.05)?

注意:我知道我可以这样做:

(Math.Round(1.33333*20)/20).ToString();

但问题是仅使用ToString()获取此结果。

1 个答案:

答案 0 :(得分:1)

您是否可以为这些组件创建ToString()的扩展重载?

如果是这样,你可以写下这样的东西:

public static class DoubleStaticExtension
{
    public static string ToString(this double value, string format, int decimalToRoundHalfwayAt)
    {
        int modifier = 2 * (int)Math.Pow(10, decimalToRoundHalfwayAt -1 );
        return (Math.Round(value * modifier, MidpointRounding.AwayFromZero) / modifier).ToString(format);
    }
}

使用

调用它
        double d = 9.333333;
        string result = d.ToString("#0.00", 2);

会得到9.35的结果

    double d = 9.333333;
    string result = d.ToString("#0.00", 1);

会得到9.50的结果