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);