【问题标题】:Decimal rounding issues小数舍入问题
【发布时间】:2020-09-17 05:25:58
【问题描述】:

我有一个场景,其中一些变量值具有十进制值,这些值可以具有前导 .0、.234、.124、.125、这样的数字等等。如果数字有前导小数和零,它应该忽略,如果一个数字有前导 3 个或更多数字,它应该四舍五入为 2。 假设代码如下:

var anone    = "23"
var antwo    = "23.0"
var anthree  = "23.467"
var anfour   = "23.125"

为了去除前导小数和零,我使用了以下方法:

 var removingzero = antwo.Replace(".0", "");
 // The result will be = 23

为了四舍五入并将数字限制为两位小数,我使用了以下方法:

 var convertodecimal = Decimal.Parse(anthree);
 var roundtotwo      = Math.Round(convertodecimal, 2);
 // The result will be = 23.47

同样为了转换最后一个我遵循相同的方法:

 var convertodecimal = Decimal.Parse(anfour);
 var roundtotwo      = Math.Round(convertodecimal, 2);
 // The result will be = 23.12
 // But the Result should be = 23.13

所以,问题是当我尝试像最后一个示例那样对任何数字进行四舍五入时,它没有这样做,我该如何解决它。

【问题讨论】:

  • 为什么要将 23.125 四舍五入到小数点后两位四舍五入到 23.13。您正在使用特定的舍入规则。该框架正在使用不同的框架(四舍五入)。您是否查看过 Math.Round docs.microsoft.com/en-us/dotnet/api/system.math.round 的文档?他们讨论这个。就像这样:docs.microsoft.com/en-us/dotnet/api/…
  • 如果你好奇为什么四舍五入是好的,请取序列 1, 1.5, 2, ... 10.5 并取其平均值 (5.75)。现在使用从零开始的四舍五入(你的老师教你的)对每个值进行四舍五入,然后取平均值 (6)。但是,如果您使用四舍五入,则平均值为 5.75。您可以在 Excel 中执行此操作(但我相信那里的 ROUND 函数总是使用从零开始的舍入)
  • 如果你有像"23.04" 这样的号码怎么办?在Replace(".0", "") 行之后,它将是"234"
  • 我还没有遇到过这个问题,但是感谢您提出一些要记住的事情:)
  • 你不会相信,我已经使用上述方法几个月了,没有任何问题,几天前你提到了这一点,今天我已经看到了你提到的价值,哈哈我该如何摆脱它?

标签: c# testing selenium-webdriver automation


【解决方案1】:

听起来你的问题是一个很长的路要问“当十进制数以5 结尾时,如何强制四舍五入?”

如果是这种情况,那么您可以使用带有 MidpointRounding 参数的 Math.Round 中的 the overload,并指定 MidpointRounding.AwayFromZeroMidpointRounding.ToPositiveInfinity

这些行为对于正数是相同的,但对于负数会有所不同,如果指定了 AwayFromZero,则 -23.125 将舍入为 -23.13,如果指定了 ToPositiveInfinity,则将舍入为 -23.12

所以你的代码可能看起来像这样:

var roundtotwo = Math.Round(convertodecimal, 2, MidpointRounding.AwayFromZero);

【讨论】:

  • 嘿,感谢您的解释,它确实解决了问题,我在整个系统中都实现了这个:)
【解决方案2】:

尝试将 Math.Round() 更改为以下:

Math.Round(num,2, MidpointRounding.AwayFromZero)

【讨论】:

    猜你喜欢
    • 2016-11-03
    • 1970-01-01
    • 1970-01-01
    • 2018-07-19
    • 1970-01-01
    • 2011-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多