我想将数字四舍五入到下一个季度(即2.1四舍五入为2.25)。我知道可以使用来获得最近的四分之一Math.Round(num * 4) / 4,但是我想对此进行扩展,以便始终将其四舍五入到下一个四分之一。
Math.Round(num * 4) / 4
到目前为止,我唯一的解决方案是使用if块,但是我想先用单线算法来尝试使事情保持简单。
从技术上讲,这是独立于语言的,但是在这种情况下,我使用的是C#。
要明确的是,以下是我想要的示例:
这样的事情怎么样?
return Math.Ceiling(x * 4) / 4;
这是一个解释。假设您要四舍五入到最接近的整数。这很容易-正是Math.Ceiling这样。
Math.Ceiling
好的,因此我们已经有一个具有所需行为的算法。它只是有一个错误的常数。
我们可以通过“映射”我们的输入来解决此问题,将每个“四分之一”视为映射到一个整体(正确地代表0.25的倍数):
0.25 => 1 0.50 => 2 0.75 => 3 1.00 => 4 1.25 => 5
&c。,&c。
这里的映射关系很简单。要从左到右,乘以4。要从右到左,除以4。请注意,每个值> = 0.25 <0.5将映射到1到2之间的值,这是我们想要的,因为Math.Ceiling将舍入到2在这种情况下,我们可以将其映射回0.5。
因此,从本质上讲,我们将输入映射到与已经实现的算法(Math.Ceiling)兼容的值;然后我们将结果映射回输入值的集合。
合理?