【问题标题】:Mathematical rounding in vb.net?vb.net中的数学舍入?
【发布时间】:2016-07-13 13:17:16
【问题描述】:

我在 vb.net 中有一个用于正确数学舍入的内置函数吗?

例如,下面的两个函数都返回 14.00,但它们应该返回 14.01:

Math.Round(14.004999, 2, MidpointRounding.AwayFromZero)
Decimal.Round(14.004999, 2, MidpointRounding.AwayFromZero)

还有其他方法可以进行适当的数学舍入吗?

【问题讨论】:

  • 为什么你认为答案应该以 .01 结尾?您正在四舍五入到小数点后三位,小数点后三位是 4。
  • 如果你期望它总是因为AwayFromZero而四舍五入,请注意枚举的名称 - MidpointRounding,它只适用于正好是中间的值 - 舍入否则可以作为平常
  • 我不希望总是四舍五入。但我希望整个数字都被考虑在内。所以在我的例子中,9 将被结转,所以整个舍入过程将是这样的:14.004999 -> 14.005 -> 14.01 我希望我现在让自己有点清醒:)
  • 这不是四舍五入的工作方式。 .004999 小于 0.005,所以会向下取整。
  • 你是对的。猜猜我在财务计算上的时间太长了,忘记了真正的数学是如何工作的:D

标签: vb.net financial calc


【解决方案1】:

这将产生预期的结果,但是...

Dim somedata As Double = 14.004999
Dim outd As Double

outd = Math.Round(somedata, 3)
outd = Math.Round(outd, 2, MidpointRounding.AwayFromZero)

【讨论】:

    【解决方案2】:

    在计算中增加 1/2 美分:

    Dim x As Decimal = 14.004999D
    
    Dim y as Decimal = Decimal.Round(x + 0.005D, 2, System.MidpointRounding.AwayFromZero)
    

    请务必在金融数学中使用 Decimal 类型而不是 Double 类型。

    【讨论】:

      【解决方案3】:

      你想要的是天花板,而不是四舍五入。

      Dim d As Decimal = 14.004999
      Dim r As Decimal = Math.Ceiling(d * 100D) / 100D
      

      【讨论】:

      • "Proper mathematical rounding" 使用天花板。上限将始终向上取整,而正确的数学四舍五入例如:0.5 -> 10.4 -> 0任何高于 且包括 .5 的内容都将向上取整,而 低于 .5 的所有内容将向下取整。
      • 如果我错了,请纠正我:你说 14.004999 应该四舍五入到 14.01,但 .0049 低于 0.005,因此它四舍五入到 0 并且你收到 14.00,如果你希望它是 14.01 你只需要四舍五入。我哪里错了?
      • 不,我从来没有这么说过。我说0.5 应该四舍五入到10.40。这是他想要类型的两个例子。然而上限总是向上取整,这意味着如果他的输入是动态的,这将无法解决问题。
      猜你喜欢
      • 2011-11-15
      • 1970-01-01
      • 1970-01-01
      • 2021-10-13
      • 1970-01-01
      • 2020-12-16
      • 1970-01-01
      • 2021-12-21
      • 1970-01-01
      相关资源
      最近更新 更多