我有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
,那么,当然,我会失go 精度:
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
Question:有没有一种方法可以只使用long
类型来计算3个非常大的整数的截断平均值?不要把这个问题看成是C语言特定的,只是我更容易在C语言中提供样本.