现状是这样的:
等级 | 低值(包含) | 高值(不含) |
1 | V1 | |
2 | V2 | V1 |
3 | V3 | V2 |
4 | V4 | V3 |
5 | V5 | V4 |
6 | V6 | V5 |
7 | V7 | V6 |
8 | V8 | V7 |
9 | V9 | V8 |
10 | V9 |
也就是说:
值 >=V1 为 1 等
值 >=V2 且 <V1 为 2 等
……
值 >=V9 且 < V8 为 9 等
值 <V9 为 10 等
已知:V1、V2、V3……V9 之间的差是相等的。
现在的需求是:想将等级细分一下,最小等级为 0.1,采用均分法。
先问:总共会分出多少个等级为?
101 个?
100 个?
99 个?
91 个?
90 个?
82 个?
答案是 82 个,为什么呢?
由于 1 和 10 只有一边有边界,所以是分不出等级的,这样等级就是:
1.0
2.0、2.1、2.2、2.3……
3.0、3.1、3.2、3.3……
……
9.0、9.1、9.2、9.3……
10.0
所以并不存在 1.1、1.2、1.3……1.9 这 9 个等级。
给一个值,如何获取其所处的等级呢?
if (值 >= V1) { return 1.0; } else if (值 < V9) { return 10.0; } else { return 9.9 - Math.Floor((值 - V9) / 每0.1等级的差值) * 0.1; }
注意 else 中的内容:
我们是以 9.9 为基准等级。
然后算出与 V9 的差值(重要:由表格,我们已经看出:值越高,等级数值越小)。
然后再看看这个差值相当于多少个“每0.1等级的差值”。
再取 Floor,注意是取 Floor,不是取 Ceiling。
最后折算成 0.1 等级。
最后得出等级。
以上是以 9.9、V9 作为基准的,为什么不反过来呢?反过来思维有点奇特:
因为 2.0 这个等级对应的基准边界值是无限接近 V1,但是它不能等于 V1。
不像 9.9 这个等级对应的基准边界值就是 V9(前面已经说了:值越高,等级数值越小,所以反过来:9.9 对应的 V9 是最小的)。
所以没使用反过来的方法。