4

我想将一个数字四舍五入到下一个季度(即 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
  • 等等...
4

3 回答 3

5

这样的事情怎么样?

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);然后我们将结果映射回我们输入的值集。

说得通?

于 2013-10-29T23:57:14.940 回答
5

您可以使用:

Math.Ceiling(num * 4) / 4.0;
于 2013-10-29T23:57:17.243 回答
3

只需这样做:

Math.Ceiling(num * 4) / 4.0;
于 2013-10-29T23:58:38.763 回答