Java 将整数映射为百分比[0100]
我正在尝试映射范围Java 将整数映射为百分比[0100],java,casting,int,double,percentage,Java,Casting,Int,Double,Percentage,我正在尝试映射范围[0.01000.0]中的所有整数 我知道公式是: ((input - min) * 100) / (max - min) 您可以想象,如果要映射整个Integer域,必须使用Integer.MIN\u VALUE和Integer.MAX\u VALUE double percentage = ((double) input - Integer.MIN_VALUE) * 100 / (Integer.MAX_VALUE - Integer.MIN_VALUE); 这里的问题
[0.01000.0]
中的所有整数
我知道公式是:
((input - min) * 100) / (max - min)
您可以想象,如果要映射整个Integer
域,必须使用Integer.MIN\u VALUE
和Integer.MAX\u VALUE
double percentage = ((double) input - Integer.MIN_VALUE) * 100 / (Integer.MAX_VALUE - Integer.MIN_VALUE);
这里的问题是Integer.MAX\u VALUE-Integer.MIN\u VALUE
将溢出到-1
我提出的解决方案是在执行任何操作之前,将每个整数
转换为双精度
double percentage = ((double) input - (double) Integer.MIN_VALUE) * 100.0 / ((double) Integer.MAX_VALUE - (double) Integer.MIN_VALUE);
一些转换为双精度的转换可以省略,但为了清楚起见,我将保留所有转换
有没有更好更干净的方法来进行这种映射?好吧,最简单的方法是将输入转换为long
,它有足够的位来精确地表示减法的结果,允许您使用第一个公式并在整数域中执行减法。不过,我不确定我会认为这是“更干净的”。实际上,将输入强制转换为双精度可能是最不令人惊讶和最实用的方法。第一件事:不强制转换就无法完成,否则将使用整数除法,即使不是这样极端的情况,也可能不需要整数除法。因此,在常规情况下,为了保证正确性,浇铸是不可避免的。在这种情况下,这种需求是由溢出强制实现的,但溢出本身并不能证明使用浮点是合理的。如果溢出是唯一的问题,那么Long可能是一个选项
第二:在每个表达式的公式中只强制转换一个元素就足够了,其他元素将被强制转换以执行此操作
例如:
这是多余的
(双精度)输入-(双精度)整数.MIN\u值
这和
(double) input - Integer.MIN_VALUE
所以,只要消除冗余就可以了
((double) input - Integer.MIN_VALUE) * 100 / ((double) Integer.MAX_VALUE - Integer.MIN_VALUE)
如果您喜欢它简短且代码简单,那么可以静态导入(不过这更多是一个意见问题)
这会将公式的同一行转换为:
((double) input - MIN_VALUE) * 100 / ((double) MAX_VALUE - MIN_VALUE)
您也可以考虑以下变量作为最终变量:
最终双百分比系数=100/((双)最大值-最小值)
最终双量程大小=(双)最大值-最小值
最后,你终于可以做到了
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);
您需要强制转换是因为溢出,而不是因为整数除法。这里的国际组没什么问题,我说你需要选角。是的,如果这两个原因都是这样的话。在这种极端情况下尝试使用这个公式……或者尝试使用long
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);