【问题标题】:Bitten by division rounding?被除法四舍五入咬了?
【发布时间】:2010-08-17 00:19:51
【问题描述】:

为什么会出现以下代码:

Console.WriteLine(String.Format("{0:C0}", 2170/ 20));

收益“$109”,同时进行

Console.WriteLine(Math.Round(2170 / 20));

给我 108?

我怎样才能得到 2170 / 20 给我 109?

【问题讨论】:

  • String.Format("{0:C0}", 2170/ 20) 给$108
  • 217/2 将是 108.5,所以作为一个整数,您希望采用哪种方式舍入?
  • @SLaks 很抱歉,代码中的 2170 由十进制变量表示。我将编辑问题
  • @James Black,我希望它与 string.Format("{0:C0}"... 的方向相同
  • 所以,做 (int)(2170/20+.5),因为这不会再进行四舍五入了。

标签: c# rounding


【解决方案1】:

当您除以整数类型的值时,例如2170 和20,运行时会执行整数除法并丢弃(截断)小数。

如果您将其中一个操作数更改为float、double 或decimal(例如2170.0 / 20 或2170 / 20m),它将执行浮点除法,如您所料.

因此,您需要将其更改为

Console.WriteLine(Math.Round(2170.0 / 20));

编辑

像这样:

Math.Round(2170m / 20, MidpointRounding.AwayFromZero)

【讨论】:

  • @SLacks 这就是我最终实现的,但是,我想知道为什么。是 String.Format("{0:C0}"... 方法在内部使用 MidpointRounding.AwayFromZero 的问题吗?
  • 首先,String.Format 使用 StringBuilder.AppendFormat,后者又使用对象对 ToString 的覆盖。当传递 MidpointRounding.AwayFromZero 时,观察到该方法的行为与 Math.Round 相同。但该方法不调用 Math.Round。
【解决方案2】:

试试 Math.Round(2170.0 / 20.0)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-13
    • 1970-01-01
    • 2023-01-12
    • 1970-01-01
    • 2012-08-04
    • 2023-03-26
    相关资源
    最近更新 更多