这可能是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'可以是任何整数。所以我想知道是否有可能建立一个公式,这样我就可以知道最大的舍入差异。
由于 托马斯
答案 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