我看到了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做上述工作?
答案 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));