舍入到最近的美元

Bax*_*ter 1 c# math rounding floor ceil

我正在寻找一种方法来舍入到最接近的美元,具有以下规定:(
如果全数50及以上,则向下舍入到下一个整数)
(如果全数49及以下舍入到当前整数)

我试过了:

Math.Round(wholenumber.xx, MidpointRounding.ToEven);
Run Code Online (Sandbox Code Playgroud)

这并不总是围绕我想要的例如1.5 = 2和2.5 = 2,因为它舍入到最接近的偶数.

我也尝试过:

Math.Round(wholenumber.xx, MidpointRounding.AwayFromZero);
Run Code Online (Sandbox Code Playgroud)

这总是向上舍入到更高的整数.

是否有任何内置功能,我想要做什么或我需要编写自己的自定义方法来检查数字和做地板或ceil取决于?

Eri*_*ert 11

首先,我注意到你应该总是用decimal这个任务; 从不使用double.如果您正在使用double,请立即停止正在执行的操作并修复程序,以便停止使用专为物理问题设计的类型,并开始使用专为金钱问题设计的类型来解决您的资金问题.

其次,当你说时,你完全错了

这总是向上舍入到更高的整数.

它不是.它舍入到最接近的整数,如果因为你处于中点没有最接近的整数,那么它选择距离零更远的整数.

试试吧,如果你不相信我:

using System;
class P
{
  static void Main()
  {
    decimal buckFifty = 1.50m;
    decimal buckFortyNine = 1.49m;
    Console.WriteLine(Math.Round(buckFortyNine, MidpointRounding.AwayFromZero));
    Console.WriteLine(Math.Round(buckFifty, MidpointRounding.AwayFromZero));
    Console.WriteLine(Math.Round(-buckFortyNine, MidpointRounding.AwayFromZero));
    Console.WriteLine(Math.Round(-buckFifty, MidpointRounding.AwayFromZero));
  }
}
Run Code Online (Sandbox Code Playgroud)

结果是

1
2
-1
-2
Run Code Online (Sandbox Code Playgroud)

  • @巴克斯特:**不**。当*在中点*时,它总是到达*远离零*的数字。这就是枚举值被称为 **MidpointRounding.AwayFromZero** 的原因。如果它总是转到 *higher* 数字,那么它将是 **MidpointRounding.ToHigherNumber**。-2 比 -1 *远离零 *,但 -1 *高于 * -2。 (2认同)