一尘不染

四舍五入到下个季度

algorithm

我想将数字四舍五入到下一个季度(即2.1四舍五入为2.25)。我知道可以使用来获得最近的四分之一Math.Round(num * 4) / 4,但是我想对此进行扩展,以便始终将其四舍五入到下一个四分之一。

到目前为止,我唯一的解决方案是使用if块,但是我想先用单线算法来尝试使事情保持简单。

从技术上讲,这是独立于语言的,但是在这种情况下,我使用的是C#。

要明确的是,以下是我想要的示例:

  • 2.0保持为2.0
  • 2.01-2.24向上舍入为2.25
  • 2.25保持为2.25
  • 2.26-2.49向上舍入为2.5
  • 等等…

阅读 279

收藏
2020-07-28

共1个答案

一尘不染

这样的事情怎么样?

return Math.Ceiling(x * 4) / 4;

这是一个解释。假设您要四舍五入到最接近的整数。这很容易-正是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)兼容的值;然后我们将结果映射回输入值的集合。

合理?

2020-07-28