【问题标题】:Rounding to midpoint of decimal place using ToString only仅使用 ToString 舍入到小数点中点
【发布时间】:2018-04-30 05:27:18
【问题描述】:

我知道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() 获得此结果。

【问题讨论】:

  • ToString() 是关于将值格式化为字符串,而不是对它们执行计算。为什么要在 ToString() 中使用这个?不能创建扩展方法吗?
  • 所以我从您的评论中猜想您的答案是“不可能”?我“想要”ToString,因为我有组件允许我通过 ToString 方法格式化输出,仅此而已。
  • @CodeCaster .ToString() 已经能够对值进行舍入以进行显示。 OP 只是想以一种非正统的方式进行舍入。我没有看到 OP 在哪里尝试使用 .ToString() 进行计算。
  • 来自docs.microsoft.com/en-us/dotnet/standard/base-types/… 我没有发现任何与现有格式类型有关的可能性。但是您可以覆盖 ToString 方法并实现自定义格式,但是您还必须使用计算来舍入它而不是纯 ToString 解决方案

标签: c# rounding tostring displayformat


【解决方案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 的结果

【讨论】:

    猜你喜欢
    • 2012-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-08
    • 1970-01-01
    • 2010-11-27
    相关资源
    最近更新 更多