【问题标题】:Round double to specific decimal value将 double 舍入到特定的十进制值
【发布时间】:2021-02-20 13:41:25
【问题描述】:

如何将双精度数舍入到下一个 .95?

这是我想要实现的目标:

4.15 should become 4.95
5.95 should become 5.95
6.96 should become 7.95

我怎样才能做到这一点?

我尝试使用 Math.Round(),但它似乎只支持四舍五入到特定数量的小数点。不是一个特定的值。 我也试过这个solution,但似乎这只适用于整数。

【问题讨论】:

标签: c# .net .net-core rounding .net-5


【解决方案1】:

这是我的想法:

public static decimal myMethod(decimal inp)
{
    decimal flr = Math.Ceiling(inp) - 0.05m;
    decimal cll = Math.Ceiling(inp) + 1m - 0.05m;
    
    return flr >= inp ? flr : cll;
}

你可能需要做一些测试,因为我只测试了你的价值观

【讨论】:

    【解决方案2】:

    没有开箱即用的功能,所以你必须实现自己的逻辑。

    第一种方法可以尝试遵循“人类逻辑”,如下所示:

    var result = (input - Math.Floor(input)) > .95
                        ? Math.Ceiling(input) + .95
                        : Math.Floor(input) + .95;
    

    正如我们所看到的,我们必须计算两次结果,所以我猜下面的方法应该更快(虽然它真的不应该重要,如果重要的话我们应该添加一个真正的基准)。

    var candidate = Math.Floor(input) + .95;
    var result = candidate < input ? candidate + 1 : candidate;
    

    【讨论】:

      【解决方案3】:

      如果你改变原点,它会变得更容易: 除了将数字 x 向上舍入到下一个 0.95,您可以将其递增 0.05,然后向上舍入到下一个整数,最后再次减去 0.05:

      Math.Ceiling(x + 0.05m) - 0.05m

      无需区分大小写。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多