将整数映射到百分比 [0,100]

Map an Integer to a percentage [0,100]

我正在尝试映射 [0.0, 100.0] 范围内的所有 Integer

我知道公式是:

((input - min) * 100) / (max - min)

你可以想象,如果你想映射整个 Integer 域,你将不得不使用 Integer.MIN_VALUEInteger.MAX_VALUE.

double percentage = ((double) input - Integer.MIN_VALUE) * 100 / (Integer.MAX_VALUE - Integer.MIN_VALUE);

这里的问题是Integer.MAX_VALUE - Integer.MIN_VALUE会溢出到-1

我想到的解决方案是在进行任何操作之前将每个 Integer 转换为 double

double percentage = ((double) input - (double) Integer.MIN_VALUE) * 100.0 / ((double) Integer.MAX_VALUE - (double) Integer.MIN_VALUE);

可以省略某些 double 的转换,但为了清楚起见,我将全部保留。

是否有更好更简洁的方法来进行此映射?

好吧,允许您使用第一个公式并在整数域中进行减法的最简单方法是将输入转换为 long,它有足够的位来准确表示减法的结果.不过,我不确定我是否会考虑 "cleaner"。在实践中,将输入转换为 double 可能是最不令人惊讶和最实用的方法。

第一件事:你不能不转换就做,否则你将有整数除法,你可能不想要,即使它不是这样的极端情况。因此,在常规情况下,转换对于正确性是不可避免的。在这种情况下,这种需要是由溢出强制执行的,但溢出本身并不能证明使用浮点数是合理的。如果溢出是唯一的问题,长可能是一个选项。

其次:每个表达式只转换公式中的一个元素就足够了,其他元素将被转换以执行此操作。

示例: 这是多余的

(double) input - (double) Integer.MIN_VALUE

相同
(double) input - Integer.MIN_VALUE

因此,只需删除您拥有的冗余

((double) input - Integer.MIN_VALUE) * 100 / ((double) Integer.MAX_VALUE - Integer.MIN_VALUE)

如果喜欢简短,代码简单,可以静态导入(不过见仁见智)

import static java.lang.Integer.MIN_VALUE;
import static java.lang.Integer.MAX_VALUE;

这会将公式的同一行转换为:

((double) input - MIN_VALUE) * 100 / ((double) MAX_VALUE - MIN_VALUE)

您还可以考虑以下作为最终变量:

final Double PERCENTAGE_COEF = 100 / ((double) MAX_VALUE - MIN_VALUE);

final Double RANGE_SIZE = (double) MAX_VALUE - MIN_VALUE;

终于可以拥有到底了

delta * PERCENTAGE_COEF

例如,如果要在可重复使用的 for 中使用,您可以选择一个比我更好的名称,您会得到类似这样的名称:

final static Double PERCENTAGE_COEF = 100 / ((double) MAX_VALUE - MIN_VALUE);

public Double apply( Double input) {
    double delta = input - MIN_VALUE;
    return delta * PERCENTAGE_COEF ;
}

不过,所有这些变化都是个人喜好问题。为了性能,您的编译器可能无论如何都会猜测常量。

更清洁的方式:

Double input = 12d;
Double min = Double.valueOf(Integer.MIN_VALUE);
Double max = Double.valueOf(Integer.MAX_VALUE);

Double percentage = (input - min)*100.0/(max-min);