在将x除以x2时计算最大舍入差异

时间:2013-03-23 09:33:59

标签: c# .net math rounding

这可能是1/2 Math,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'可以是任何带有2位小数的数字,'x'可以是任何整数。所以我想知道是否有可能建立一个公式,这样我就可以知道最大的舍入差异。

由于 托马斯

2 个答案:

答案 0 :(得分:3)

好的,你想要数学 - 让我们玩得开心!

假设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):

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

但我们知道

x / 2 <= r < x,

所以最大差异将是最大r:(*)

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

如您所见,我们仍依赖于特定的x,因此我们需要对其进行一些估算。如果它是完全随机的 - 我们可以有任何舍入差异直到d本身

例如,如果我们说x&lt;那么我们有max diff = d / 200

添加编程部分:

        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?因为在(*)中我们有隐含的假设,对于任何x,r可以是x / 2,这不是真的,但希望它足以满足你的目的。

答案 1 :(得分:1)

您可以使用此单线公式计算差异:

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

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