计算x除以x2时的最大舍入差

本文关键字:舍入 除以 x2 计算 | 更新日期: 2023-09-27 18:05:20

这可能是1/2数学,1/2编程的问题。但我们开始吧。

我有一个随机的2位小数。我要把这个除以一个随机整数。那么我想知道可能的最大舍入差。

的例子:

  decimal number = 100.00M;
  int x = 3;
  var result = number/x;
  var roundedResult = Round(result, 2, MidpointRoundingEx.AwayFromZero);
  // roundedResult = 33.33
  var roundingDiff = number - (roundedResult * x);
  // roundingDiff = 0.01

在这个例子中,舍入差是0.01。

但是'number'可以是任何有两个小数的数,'x'可以是任何整数。所以我想知道是否有可能提出一个公式,这样我就可以知道在任何情况下最大的四舍五入差。

谢谢托马斯。

计算x除以x2时的最大舍入差

好的,你想要数学-让我们做有趣的!

假设d是一个随机的有两位小数的十进制数。

我们可以很容易地说

100d = n * x + r, 
where 100d, n, x, r are integers, and 0 <= r < x

d / x = n / 100 + r / 100x
从舍入的角度来看,这里的

n/100总是"好"的,所以我们对"r/x"部分很感兴趣,因为它是唯一影响舍入的部分:

0 <= r / x < 1,
0 <= r / 100x < 0.01

如果r/100x>= 0.005,它在四舍五入的结果上加0.01。也就是r/x>= 1/2,也就是r>= x/2

那么(d/x)舍入等于

(1) n / 100, when r < x / 2, or
(2) n / 100 + 0.01, when r >= x / 2

舍入差为

diff = d - (n / 100) * x              for (1), or
diff = d - (n / 100) * x + 0.01 * x   for (2)

截至

(n / 100) * x  = d - r/100

我们有(2)的最大diff:

max diff = r / 100 + 0.01 * x = (r + x) / 100

但是我们知道

x / 2 <= r < x,

所以最大diff将为最大r: (*)

max diff = 2 * x * 0.01 = x / 200

如你所见,我们仍然依赖于特定的x,所以我们需要对它做一些估计。如果它是完全随机的-我们可以使用任何舍入差值,直到d本身

例如我们输入x <然后是Max diff="D/200</p">

并添加编程部分:

        decimal number = 100.00M;
        decimal max = decimal.MinValue;
        decimal min = decimal.MaxValue;
        int maxX = 0;
        int minX = 0;
        for (int x = 1; x <= number; x++)
        {
            var result = number / x;
            var roundedResult = Math.Round(result, 2, MidpointRounding.AwayFromZero);
            var roundingDiff = number - (roundedResult * x);
            if (roundingDiff < min)
            {
                min = roundingDiff;
                minX = x;
            }
            if (roundingDiff > max)
            {
                max = roundingDiff;
                maxX = x;
            }
        }
        Console.WriteLine("Max is {0} for {1}", max, maxX);
        Console.WriteLine("Min is {0} for {1}", min, minX);
        Console.WriteLine("Delta is {0}", max - min);
        Console.WriteLine("d / 200 = {0}", number / 200);

输出:

Max is 0.40 for 83
Min is -0.44 for 93
Delta is 0.84
d / 200 = 0.50

为什么不正好是0.5呢?因为在(*)中我们有一个隐式假设r可以是x/2对于任何x,这是不正确的,但希望这对你们来说足够了

您可以使用下面的一行公式计算diff:

var roundingDiff = ((int)(number * 100) % x - ((int)(number * 100) % x + x / 2) / x * x) / 100M;

对于给定的x,最大舍入差为x / 200