1

我想编写一个组件,它可以将值向上移动一个增量,或者移动到最近的增量。

假设增量为 0.0005,对于 Up() 方法,这将是预期的输入和输出:

  • 1.0005 -> 1.0010(增量,因此它按增量移动)
  • 1.0006 -> 1.0010(不是增量,所以移动到增量)
  • 1.0007 -> 1.0010
  • 1.0008 -> 1.0010
  • 1.0009 -> 1.0010
  • 1.0010 -> 1.0015(增量,因此它按增量移动)
  • 1.0011 -> 1.0015
  • 1.0012 -> 1.0015
  • ETC

Down() 方法也会做同样的事情,相反。

我想出了这个公式:

return (value + increment) - (value % increment);

我预计 Down() 方法会相似,但我找不到它是什么。我能够让它工作的唯一方法是:

decimal mod = value % increment;

return mod != 0  ? value - mod : value - increment

当然,如果反向操作相同,那么公式应该相同。

4

2 回答 2

1
    public static decimal Increment(decimal dec, decimal inc) {
        var mod = (dec % inc);
        return dec - Math.Abs(mod) + (inc < 0 && mod != 0 ? Math.Abs(inc) : 0) + inc;
    }

没有三元运算符:

    public static decimal Increment(decimal dec, decimal inc) {
        var mod = (dec % inc);
        var signInc = Math.Sign(inc);
        return dec - Math.Abs(mod) + 
              ((decimal)(Math.Pow(signInc, 2) - signInc) / 2) * 
                    Math.Abs(Math.Sign(mod)) * 
                    Math.Abs(inc)
                + inc;

    }

  ((decimal)(Math.Pow(signInc, 2) - signInc) / 2) * 
                    Math.Abs(Math.Sign(mod)) * 
                    Math.Abs(inc)

替换三元表达式。如果为负Math.Pow(signInc, 2) - signInc) / 2则返回 1 ,否则返回 0。如果为 0,则返回 0 ,否则返回 1;如果第一次乘法的结果为 1 ,否则为 0。incMath.Abs(Math.Sign(mod))modinc < 0 && mod != 0

于 2013-09-20T07:46:02.317 回答
0

公式

value - Abs(value % increment) + Abs(increment/2) + increment/2

以值 1.0006 为例,增量 (+_)0.0005

当向上增量为 +0.0005

1.0006-0.0001+0.00025+0.00025 = 1.0010

当向下增量为 -0.0005

1.0006-0.0001+0.00025-0.00025 = 1.0005
于 2013-09-20T07:39:24.867 回答