我正在尝试映射Integer
范围内的所有[0.0, 100.0]
。
我知道公式是:
((input - min) * 100) / (max - min)
您可以想象,如果您要映射整个Integer
域,则必须使用Integer.MIN_VALUE
和Integer.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
的部分演员,但为了清楚起见,我会留下所有演员。
是否有更好更清洁的方法来进行此映射?
答案 0 :(得分:1)
清洁方式:
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);
答案 1 :(得分:0)
嗯,允许您使用第一个公式并在整数域中进行减法的最简单方法是将输入转换为long
,其中有足够的位来准确表示减法的结果。不过,我不确定我会认为那个“更干净”。在实践中,将输入转换为double
可能是最不令人惊讶和最实用的方法。
答案 2 :(得分:-2)
第一件事:如果没有施法你就不能这样做,否则你会有整数除法,你可能不会想要,即使它不是这样的极端情况。因此,在常规情况下,铸造是不可避免的正确性。在这种情况下,这种需要由溢出强制执行,但仅溢出并不能证明使用浮点。如果溢出是唯一的问题,那么Long可能是一个选择。
第二:每个表达式只能在公式中转换一个元素,其他元素将被转换为执行此操作。
实施例: 这是多余的
(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
例如,如果要在可重复使用中使用它,你可以选择一个比我更好的名字,你会有类似的东西:
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 ;
}
所有这些变化都是品味问题。为了提高性能,您的编译器可能会猜测常量。