1

ループでは、目的の # に到達するまで 0.10 を追加し、インデックスを取得しています。これは私のコードです:

    private static int getIndexOfUnits(float units) {
    int index = -1;
    float addup = 0.10f;
    for(float i = 1.00f; i < units; i=(float)i+addup) {
        index++;
        System.out.println("I = " + i + " Index = " + index);
    }

    return index;
}

渡された単位が 5.7 の場合、表示される数値は次のとおりです。

I = 1.0 Index = 0
I = 1.1 Index = 1
I = 1.2 Index = 2
I = 1.3000001 Index = 3
I = 1.4000001 Index = 4
I = 1.5000001 Index = 5
I = 1.6000001 Index = 6
I = 1.7000002 Index = 7
I = 1.8000002 Index = 8
I = 1.9000002 Index = 9
I = 2.0000002 Index = 10
I = 2.1000001 Index = 11
I = 2.2 Index = 12
I = 2.3 Index = 13
I = 2.3999999 Index = 14
I = 2.4999998 Index = 15
I = 2.5999997 Index = 16
I = 2.6999996 Index = 17
I = 2.7999995 Index = 18
I = 2.8999994 Index = 19
I = 2.9999993 Index = 20
I = 3.0999992 Index = 21
I = 3.199999 Index = 22
I = 3.299999 Index = 23
I = 3.399999 Index = 24
I = 3.4999988 Index = 25
I = 3.5999987 Index = 26
I = 3.6999986 Index = 27
I = 3.7999985 Index = 28
I = 3.8999984 Index = 29
I = 3.9999983 Index = 30
I = 4.0999985 Index = 31
I = 4.1999984 Index = 32
I = 4.2999983 Index = 33
I = 4.399998 Index = 34
I = 4.499998 Index = 35
I = 4.599998 Index = 36
I = 4.699998 Index = 37
I = 4.799998 Index = 38
I = 4.8999977 Index = 39
I = 4.9999976 Index = 40
I = 5.0999975 Index = 41
I = 5.1999974 Index = 42
I = 5.2999973 Index = 43
I = 5.399997 Index = 44
I = 5.499997 Index = 45
I = 5.599997 Index = 46
I = 5.699997 Index = 47

単位が 18.90 や 29.90 のような大きな数値の場合、間違ったインデックスが返されます。インデックスは通常、本来あるべき値よりも 1 小さい値です。最初は 0.10 だけ追加されましたが、2.3 以降では 0.10 を追加すると 2.39999.... になります。これは精度の問題だと思います。それを処理する方法と、float や double の使用に関係なく、大きな # で正しいインデックスを取得することを確認する方法。

何か案は !!!!

4

5 に答える 5

11

浮動小数点ガイドから:

0.1 + 0.2 などの数値を足して 0.3 にならず、代わりに 0.30000000000000004 のような奇妙な結果が得られるのはなぜですか?

内部的に、コンピューターは 0.1、0.2、0.3 などの数値を正確に表すことができない形式 (2 進浮動小数点) を使用しているためです。

コードがコンパイルまたは解釈されると、「0.1」はすでにその形式の最も近い数値に丸められているため、計算が行われる前であっても小さな丸め誤差が発生します。

正確に合計するために数字が必要な場合はfloat、またはを使用できません。代わりにdouble使用してください。BigDecimal

于 2012-05-07T11:23:16.603 に答える
1

Floatデータ型では、正確な表現は使用できません。

BigDecimalが役立ちます。以下の例が役立つ場合があります

BigDecimal decimal=new BigDecimal(10.0);
    for (int i = 0; i < 10; i++) {
        decimal=decimal.add(new BigDecimal(.1));
        System.out.println(decimal.floatValue());

    }
于 2012-05-07T11:25:50.290 に答える
1

問題は、float が使用する形式がすべての 10 進数を表すことができないため、精度が失われる場合があることです。

代わりにBigDecimalを使用してください。

于 2012-05-07T11:24:26.207 に答える
0

この種のこと(インデックス作成/反復)にはfloatを使用しないでください。

毎回Iを計算してみてください:

I = 1.0f + (i*addup);

また、浮動小数点エラーが蓄積されることはありません。

于 2012-05-07T11:42:07.263 に答える
0

これはあなたが探しているものかもしれないと思います:

Java は import パッケージからクラスを提供します: import java.text.DecimalFormatと呼ばれるDecimalFormat。その署名は次のとおりです。

DecimalFormat myFormat = new DecimalFormat("0.0");

フォーマットの表示方法を指定する String 引数を取ります。

これをコードに適用する方法は次のとおりです。

DecimalFormat myFormat;
private static int getIndexOfUnits(float units) {
myFormat = new DecimalFormat("0.0");
int index = -1;
float addup = 0.10f;
for(float i = 1.00f; i < units; i=(float)i+addup) {
    index++;
    System.out.println("I = " + myFormat.format(i) + " Index = " + index);
}

return index;

}

println では、DecimalFormatへの myFormat オブジェクト参照を使用して、DecimalFormat のクラスformat()メソッドが呼び出されていることがわかります。ここでフォーマットが行われます。float i

于 2012-05-07T13:19:23.230 に答える