1

我看到了映射数字算法的这个问题

我正在尝试在 java 中实现 @PeterAllenWebb 解决方案,如下所示:

long A = 1l;
long B =  999999999l;
long C = 1000000000l;
long D = 9999999999l;
long X =  999999998l;
long Y =   (D-C)*(X-A)/(B-A) + C;
System.out.println("original is " + X);     
long reverseX = (B-A)*(Y-C)/(D-C) + A;
System.out.println("reverse is " + reverseX);

但是,这并不总是有效。

见下文:

    X     reverseX
999999998 999999997
1         1
999999999 999999999
12        11

如您所见,只有最小值 (A) 和最大值 (B) 返回正常。

其余的,我需要加 1。这在我看来是地板/圆形/数学问题,我不想依赖计算它的 JVM。我希望它始终有效。

我怎样才能使上述工作适用于reverseX?

4

1 回答 1

1

你正面临一个古老的问题。默认情况下,Java 中的除法是双倍的。因此,如果您的除法结果是 1.0 或 1.3 或 1.9,它将被截断为 1。在您的情况下,同样的情况正在发生。尝试将其从 long 更改为如下所示的两倍

double A = 1L;
double B = 999999999l;
double C = 1000000000l;
double D = 9999999999l;
double X = 999999998l;
double Y = (D - C) * (X - A) / (B - A) + C;

System.out.println("original is " + new DecimalFormat("#").format(X));
double reverseX = (B - A) * (Y - C) / (D - C) + A;
System.out.println("reverse is  "
        + new DecimalFormat("#").format(reverseX));
于 2013-02-19T11:32:04.533 回答