1

この for ループは、ツリーマップに含まれるすべての値を合計する必要があります。これは機能しますが、内側のループの後、up と down の値を使用して精度が計算されます。これは決して実行されないようです。

私は何を間違っていますか?

            // for each row
        for (Entry<String, TreeMap<String, Integer>> table_row : table.entrySet()) {

            // write the label
            String row = table_row.getKey() + ",";

            int up = 0;
            int down = 0;
            float accu = 0;
                    // for each treemap in the row
            for (Entry<String, Integer> collumn : table_row.getValue().entrySet()) {
                row += collumn.getValue() + ",";
                down += collumn.getValue();//this works
                if (collumn.getKey() == table_row.getKey()) {
                    up = collumn.getValue();
                    }
            }

    --------->  accu = (up / down) * 100; //this is not executed?? 
            System.out.println("t: " + up + " n: " + down + " a: " +  accu);
            row = row + Float.toString(accu) + " %";
            writer.println(row);//this works too but output is always 0%
        }
4

4 に答える 4

3

おそらく if 比較では == は必要ありませんが、文字列の同じインスタンスであると予想しない限り、equals()... は必要ありません。

于 2012-07-31T20:32:51.423 に答える
3

コメントのインラインと同じ理由accuを常に尋ねていると思います。 リテラルはand と同様です。したがって、結果はおそらく次のように丸められます0
accu = (up / down) * 100;
100intupdown0

float精度を失わないようにキャストするだけです。キャストが
accu = ((float)up / down) * 100;
除算に先行するため、これは機能しfloatます。floatint

于 2012-07-31T20:32:55.093 に答える
1

整数除算!

あなたのdown値はあなたよりも大きく、upゼロに切り捨てられるため、を割り当てるたびにaccu、これを効果的に行っていますaccu = (0) * 100

精度を求める場合は、int の代わりに up と down の float を作成するか、除算の直前にキャストする必要があります。

于 2012-07-31T20:35:27.197 に答える
0

あなたが抱えている問題は、上と下の両方がintsであることです。int を int で除算すると、結果は小数点以下が切り捨てられた int になります。パーセントが必要なように見えるので、次のようにする必要があります。

accu = ((float) up / down) * 100;
于 2012-07-31T20:37:58.970 に答える