【问题标题】:Round to the nearest dollar四舍五入到最接近的美元
【发布时间】:2012-04-22 05:44:13
【问题描述】:

我正在寻找一种按照以下规定四舍五入到最接近的美元的方法:
(如果 Wholenumber.50 及以上四舍五入到下一个整数)
(如果为 Wholenumber.49 及以下,则向下舍入为当前整数)

我试过了:

Math.Round(wholenumber.xx, MidpointRounding.ToEven);

这并不总是四舍五入,例如 1.5 = 2 和 2.5 = 2,因为它四舍五入到最接近的偶数。

我也试过了:

Math.Round(wholenumber.xx, MidpointRounding.AwayFromZero);

这总是四舍五入到较大的整数。

对于我正在尝试做的事情是否有任何内置功能,或者我是否需要编写自己的自定义方法来检查数字并根据 floor 或 ceil 进行操作?

【问题讨论】:

  • 使用浮点运算来存储货币从来都不是一个好主意..
  • 我认为你可以在没有第二个参数的情况下执行 Math.round 吗?这是您描述的默认舍入。
  • MidpointRounding.AwayRoundZero 就是您所描述的。这并不意味着对所有值进行四舍五入,仅对中点 (0.5) 进行四舍五入。
  • @Jack:使用浮点运算是完全可以接受的;你应该避免 binary 浮点运算。 decimal 类型是浮点类型,它只是不是 binary 浮点类型。顾名思义,它是一个decimal浮点类型。
  • 你没有说你想要负数发生什么。当您对负数说“向上取整”时,您是指幅度向上取整——远离零——还是值向上取整——向零取整?

标签: c# math rounding floor ceil


【解决方案1】:

首先,我注意到您应该始终使用decimal 来执行此任务;永远不要使用double。如果您正在使用double,请立即停止您正在做的事情并修复您的程序,以便您停止使用专为物理问题设计的类型并开始使用专为金钱设计的类型em> 问题来解决你的金钱问题。

第二,你说的完全是错误的

这总是四舍五入到较大的整数。

它没有。它四舍五入到最接近的整数,如果因为您处于中点而没有最接近的整数,那么它会选择离零更远的整数

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

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));
  }
}

结果是

1
2
-1
-2

【讨论】:

  • 我明白你的意思。我是在处于中点的背景下考虑的。它总是在中点时达到更高的数字。我也已经在使用 Decimal 了。
  • @Baxter:“它总是在中点时达到更高的数字。” - 根据你的问题,这正是你想要的......
  • 谢谢,这让我明白了。
  • @Baxter:没有。当在中点时,它总是会转到远离零的数字。这就是枚举值被称为 MidpointRounding.AwayFromZero 的原因。如果它总是到达 higher 数字,那么它将是 MidpointRounding.ToHigherNumber。 -2 比 -1离零远,但 -1 比 -2 高
  • 这是有道理的。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多