我有3个非常大的有符号整数。
long x = long.MaxValue;
long y = long.MaxValue - 1;
long z = long.MaxValue - 2;
我想计算他们的平均值。预期平均值long.MaxValue - 1
为9223372036854775806
。
不可能将其计算为:
long avg = (x + y + z) / 3; // 3074457345618258600
注意:我阅读了所有有关2个数的平均值的问题,但是我看不到该技术如何应用于3个数的平均值。
使用会很容易BigInteger
,但是假设我无法使用它。
BigInteger bx = new BigInteger(x);
BigInteger by = new BigInteger(y);
BigInteger bz = new BigInteger(z);
BigInteger bavg = (bx + by + bz) / 3; // 9223372036854775806
如果我转换为double
,则当然会失去精度:
double dx = x;
double dy = y;
double dz = z;
double davg = (dx + dy + dz) / 3; // 9223372036854780000
如果将decimal
其转换为,则可以使用,但还要假设我无法使用它。
decimal mx = x;
decimal my = y;
decimal mz = z;
decimal mavg = (mx + my + mz) / 3; // 9223372036854775806
问题:是否有一种方法仅使用long
type 可以计算3个非常大的整数的截断平均值?不要认为该问题是C#特有的,对我而言,使用C#提供示例更加容易。
long.MinValue
和long.MaxValue
值之间。
BigInteger
还是decimal
被排除在外,或者是它只是使这个硬的缘故?