【问题标题】:Math.Ceiling() on expression when dividing and multiplying by same numberMath.Ceiling() 在除以和乘以相同数字时的表达式
【发布时间】:2015-08-10 15:20:53
【问题描述】:

C# 中的 Math.Ceiling() 有点麻烦。

我将其称为除以数字后乘以相同数字的结果,例如20 000 / 184 * 184。我希望结果是 20 000,但它是 20 001。在尝试向上取整值时,是否有任何可能的方法来避免这种行为?

提前谢谢你

【问题讨论】:

  • 1.什么是“除法乘法”? 2. 你用什么语言?
  • 糟糕,对不起,我使用的是 C#...嗯,这只是这些变量进入此函数的随机情况...我可以检查然后在此变量中设置回原始值,但我想知道是否有有更好的解决方案
  • 很奇怪。在 C# 中,当您对整数进行除法时,您总是得到删除了所有小数的整数。结果很可能小于20000;它应该是 19872 之类的东西。得到 20001 很奇怪。也许您应该发布出现问题的代码行。
  • 我认为这段代码存在问题:decimal twentyThousand = 20000; decimal oneEightyFour = 184; decimal result = twentyThousand / oneEightyFour * oneEightyFour; decimal newResult = Math.Ceiling(result);

标签: c# multiplication divide


【解决方案1】:

运行您提供的代码时,我们有以下内容

twentyThousand/oneEightyFour * oneEightyFour

答案是20000.000000000000000000000001

因此,当你做天花板时,我们有20001

通过下面的文章,我认为结果是由于执行除法时引入的不准确性,这产生了108.69565217391304347826086957,正如 Jon 所说的

作为一个非常广泛的经验法则,如果您最终看到一个非常长的字符串表示形式(即,大多数 28/29 数字不是零),那么您很可能在此过程中遇到了一些不准确的情况。

http://csharpindepth.com/Articles/General/Decimal.aspx

【讨论】:

  • 这正是发生的事情......那么这里有什么好的解决方案吗?或者我应该在我的代码中控制这些值是否相同?
  • @Neox 因为它是导致问题的除法,先进行乘法然后再进行除法。这样做的问题是其他值可能会导致计算中的其他地方出现不精确。
【解决方案2】:

正如 cmets 中指出的那样,您根本不应该得到 20001。

20000 / 184 将得到 108。然后乘以 184 将得到 19872。

您在某处做与您发布的内容不同的事情。 Math.Ceiling() 是在哪里调用的?

我会说,如果数字是硬编码的,你可以在代码中放一个小数,它会这样对待它。如果您使用表示数字的变量,请确保将它们格式化为某种浮点类型(十进制、双精度、浮点),具体取决于所需的精度。

Console.WriteLine(20000 / 184 * 184);  // 19872
Console.WriteLine((20000.0 / 184.0 * 184.0));  // 20000

【讨论】:

    【解决方案3】:

    在尝试向上取整值时,是否有任何可能的方法来避免这种行为?

    在这种特殊情况下,您可以通过先乘法,然后除法来避免该问题:

    result = (20000m * 184m) / 184m ;
    

    由于在除法中会丢失精度,因此首先乘法可以防止在乘法时不精确的形式被夸大。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-14
      • 2017-03-27
      • 1970-01-01
      • 1970-01-01
      • 2022-11-28
      • 1970-01-01
      • 2023-02-02
      • 1970-01-01
      相关资源
      最近更新 更多