OP的代码已经接近但会受益于四舍五入的划分而不是标准的整数划分。所以添加一个偏见。偏差取决于操作数的符号。
// avg = ((avg * (n-1)) + currentReading)/n;
avg = (avg * (n-1)) + currentReading + bias)/n;
第二个问题是范围之一:(avg * (n-1)) + currentReading
容易溢出。求助于更广泛的数学的最简单的解决方案。使用更宽的类型
// Example, depends on system
// avg * (n-1)) + currentReading
1uLL * avg * (n-1)) + currentReading
一起把这个:
// avg = ((avg * (n-1)) + currentReading)/n;
int avg, currentReading;
int n; // n > 0
int2x numerator; // int2x some type 2x wide as int, maybe long long
numerator = (int2x)avg * (n-1) + currentReading; // Wider math
int bias = n/2;
if (numerator < 0) bias = -bias;
numerator += bias;
avg = (int) (numerator/n);
哪里是你的问题吗? –
你有什么问题与你的尝试? –