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では除算はdoubleです。したがって、除算の結果が1.0、1.3、または1.9の場合、1に切り捨てられます。あなたの場合、同じことが起こります。以下の長さから2倍に変更してみてください

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 に答える