0

重複の可能性:
Java float 除算の精度

あるゲームのバグを修正しようとしていますが、そのための最適なタイル サイズを計算する必要があります。これを行うには、デバイスの画面解像度、そのレベルの行数と列数を取得し、ゲームが最大画面スペースを使用できるタイル サイズを計算します。ただし、Android は基本的な計算に失敗しているようで、単純な除算で精度が失われています。適切なコードは次のとおりです。

while(!foundIt)
    {
        int tileArea = boxes*i*i; //Boxes = 20*26
        float ratio = displayArea/tileArea;  //displayArea = width*height
        Log.d("Balance", displayArea + "/" + tileArea);
        Log.d("Balance", boxes + ", " + i);
        Log.d("Balance", "Ratio: " + ratio);
        int last = 0;
        if(ratio>1)
        {
            if(last==LAST_WAS_LESS_THAN_ONE)
            {
                i--;
                foundIt=true;
            }
            last = LAST_WAS_MORE_THAN_ONE;
        }
        else if(ratio==1)
        {
            Log.d("Balance", "Found a perfect fit!!");
            foundIt=true;
        }
        else if(ratio<1)
        {
            if(last==LAST_WAS_MORE_THAN_ONE)
            {
                i--;
                foundIt=true;
            }
            last = LAST_WAS_LESS_THAN_ONE;
        }
        if(!foundIt)
        {
            i++;
        }
    }

これは、私の Nexus S で実行したサンプルです (解像度: 480 x 800):

06-18 13:20:45.808: D/Balance(1069): Width: 480 Height: 800
06-18 13:20:45.808: D/Balance(1069): 384000/520
06-18 13:20:45.808: D/Balance(1069): 520, 1
06-18 13:20:45.808: D/Balance(1069): Ratio: 738.0
06-18 13:20:45.808: D/Balance(1069): 384000/2080
06-18 13:20:45.808: D/Balance(1069): 520, 2
06-18 13:20:45.808: D/Balance(1069): Ratio: 184.0
06-18 13:20:45.808: D/Balance(1069): 384000/4680
06-18 13:20:45.808: D/Balance(1069): 520, 3
06-18 13:20:45.808: D/Balance(1069): Ratio: 82.0
06-18 13:20:45.808: D/Balance(1069): 384000/8320
06-18 13:20:45.808: D/Balance(1069): 520, 4
06-18 13:20:45.808: D/Balance(1069): Ratio: 46.0
06-18 13:20:45.808: D/Balance(1069): 384000/13000
06-18 13:20:45.808: D/Balance(1069): 520, 5
06-18 13:20:45.808: D/Balance(1069): Ratio: 29.0
06-18 13:20:45.808: D/Balance(1069): 384000/18720
06-18 13:20:45.808: D/Balance(1069): 520, 6
06-18 13:20:45.808: D/Balance(1069): Ratio: 20.0
06-18 13:20:45.808: D/Balance(1069): 384000/25480
06-18 13:20:45.808: D/Balance(1069): 520, 7
06-18 13:20:45.808: D/Balance(1069): Ratio: 15.0
06-18 13:20:45.808: D/Balance(1069): 384000/33280
06-18 13:20:45.808: D/Balance(1069): 520, 8
06-18 13:20:45.808: D/Balance(1069): Ratio: 11.0
06-18 13:20:45.808: D/Balance(1069): 384000/42120
06-18 13:20:45.808: D/Balance(1069): 520, 9
06-18 13:20:45.808: D/Balance(1069): Ratio: 9.0
06-18 13:20:45.808: D/Balance(1069): 384000/52000
06-18 13:20:45.808: D/Balance(1069): 520, 10
06-18 13:20:45.808: D/Balance(1069): Ratio: 7.0
06-18 13:20:45.808: D/Balance(1069): 384000/62920
06-18 13:20:45.808: D/Balance(1069): 520, 11
06-18 13:20:45.808: D/Balance(1069): Ratio: 6.0
06-18 13:20:45.808: D/Balance(1069): 384000/74880
06-18 13:20:45.808: D/Balance(1069): 520, 12
06-18 13:20:45.808: D/Balance(1069): Ratio: 5.0
06-18 13:20:45.808: D/Balance(1069): 384000/87880
06-18 13:20:45.808: D/Balance(1069): 520, 13
06-18 13:20:45.808: D/Balance(1069): Ratio: 4.0
06-18 13:20:45.808: D/Balance(1069): 384000/101920
06-18 13:20:45.808: D/Balance(1069): 520, 14
06-18 13:20:45.808: D/Balance(1069): Ratio: 3.0
06-18 13:20:45.808: D/Balance(1069): 384000/117000
06-18 13:20:45.808: D/Balance(1069): 520, 15
06-18 13:20:45.808: D/Balance(1069): Ratio: 3.0
06-18 13:20:45.808: D/Balance(1069): 384000/133120
06-18 13:20:45.812: D/Balance(1069): 520, 16
06-18 13:20:45.812: D/Balance(1069): Ratio: 2.0
06-18 13:20:45.816: D/Balance(1069): 384000/150280
06-18 13:20:45.816: D/Balance(1069): 520, 17
06-18 13:20:45.816: D/Balance(1069): Ratio: 2.0
06-18 13:20:45.816: D/Balance(1069): 384000/168480
06-18 13:20:45.816: D/Balance(1069): 520, 18
06-18 13:20:45.816: D/Balance(1069): Ratio: 2.0
06-18 13:20:45.816: D/Balance(1069): 384000/187720
06-18 13:20:45.816: D/Balance(1069): 520, 19
06-18 13:20:45.816: D/Balance(1069): Ratio: 2.0
06-18 13:20:45.816: D/Balance(1069): 384000/208000
06-18 13:20:45.816: D/Balance(1069): 520, 20
06-18 13:20:45.816: D/Balance(1069): Ratio: 1.0
06-18 13:20:45.816: D/Balance(1069): Found a perfect fit!!

電卓で比率を計算すると、精度が失われます。これがなぜなのか誰か知っていますか?私の実装に何か問題がありますか?

4

2 に答える 2

2

プリントアウトから、 and は or として宣言されてdisplayAreaいるようtileAreaです。そして、結果が型に昇格されてに割り当てられる前に、整数除算( )を行っています。intlongdisplayArea/tileAreafloatratio

displayArea一方が他方よりも大きいかどうかを比較しているので、と を直接比較してみませんtileAreaか? 浮動小数点演算をいじるよりもはるかに優れています。

于 2012-06-18T08:02:22.490 に答える
0

Type Castingの問題のようです。displayAreaをfloatにキャストしてみてください。

于 2012-06-18T08:02:38.593 に答える