Exemple #1
0
        /// <summary>
        /// 当前值是否粗差。
        /// </summary>
        /// <returns></returns>
        private bool IsGrossError()
        {
            var alignedValue = CurrentRawValue.Value - IntegerPart;

            var isError = ErrorJudge.IsOverLimit(alignedValue, CurrentFilteredFraction.Value);

            return(isError);
        }
        /// <summary>
        /// 新增加一个数据判断通过后才入库。
        /// 添加成功后返回true。
        /// </summary>
        /// <param name="key"></param>
        public override Boolean CheckAndAdd(double newVal, NumeralWindowData buffer)
        {
            //这里同父类一样,采用原始数据判断,以减少计算量。
            if (ErrorJudge.IsFirst)   // 第一次取其小数
            {
                IntBias = CaculateIntBias(buffer.GetNeatlyWindowData());
                ErrorJudge.SetReferenceValue(newVal);
            }
            else
            {
                ErrorJudge.SetReferenceValue(this.IntFraction.Value);
            }

            var fraction = newVal - IntBias;

            if (ErrorJudge.IsOverLimit(newVal))//判断是否超限
            {
                var list = buffer.InsertAndReturnNew(0, newVal);

                if (ErrorJudge.IsJumped(list))//跳跃,则重新计算整数值,否则认为是粗差,直接忽略。
                {
                    var newBuffer2 = new NumeralWindowData(list);
                    var biasBuffer = newBuffer2.GetNeatlyWindowData();
                    IntBias = CaculateIntBias(biasBuffer);

                    fraction = newVal - IntBias;
                    Add(fraction);
                    return(true);
                }
                return(false);
            }
            else
            {
                Add(fraction);
                return(true);
            }
        }