数学 - 映射数字java

时间:2013-02-19 09:59:36

标签: java math

我看到了this question的映射数算法。

我正试图在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做上述工作?

1 个答案:

答案 0 :(得分:1)

你正面临着一个古老的问题。默认情况下,Java中的分割是双倍的。因此,如果您的除法结果是1.0或1.3或1.9,它将被截断为1.在您的情况下,同样的情况也会发生。尝试将其从长时间改为加倍

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