如何编写对齐值公式的对称版本(在 C# 中)
本文关键字:版本 对称 对齐 何编写 | 更新日期: 2023-09-27 18:32:16
我想编写一个组件,可以将值向上移动一个增量量,或者移动到最接近的增量。
假设增量为 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
- 等
相反,Down() 方法也会做同样的事情。
我想出了这个公式:
return (value + increment) - (value % increment);
我预计 Down() 方法会类似,但我找不到它是什么。我能够让它工作的唯一方法是执行以下操作:
decimal mod = value % increment;
return mod != 0 ? value - mod : value - increment
当然,如果操作相反是相同的,那么公式应该是相同的。
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)
替换三元表达式。 如果inc
为负数,则返回 Math.Pow(signInc, 2) - signInc) / 2
,否则返回 0。 如果mod
为 0,则返回 Math.Abs(Math.Sign(mod))
,否则返回 1;如果inc < 0 && mod != 0
则使第一次乘法的结果为 1,否则为 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