【发布时间】:2014-07-19 22:18:31
【问题描述】:
我有 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# 中提供示例。
【问题讨论】:
-
为什么不计算总体平均差异并从最大值中减去?
-
@AndreasNiedermair 如果我的值中有
long.MinValue和long.MaxValue,则不会工作。 -
确实不错:)
-
你确定我们需要担心这个,这不应该由框架来处理吗?
-
排除
BigInteger或decimal是否有任何实际原因,还是只是为了让它变得困难?
标签: c# .net long-integer