【问题标题】: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
无需区分大小写。