最佳答案
我有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
类型来计算3个非常大的整数的截断平均值?不要认为这个问题是 C # 特有的,只是对我来说,用 C # 提供示例更容易。