web-dev-qa-db-ja.com

整数除算コードの答えが間違っているのはなぜですか?

Java(1時間あたりの製品数量/生産量))には非常に単純な区分がありますが、この区分を行うたびに奇妙なエラーが発生します。

float res = quantity / standard;

私は上記の除算をいくつかの値で試してみましたが、常にエラーが発生しますが、他のどこでも試してみて、正しくなったのはこれです:

世界のどこでも:

13.6 = 6800 / 500;

Java:

13.0 = 6800 / 500;

BigDecimalとBigIntegerを調査しましたが、この除算を作成する方法を見つけられませんでした。精度のエラーなしでこの除算をJavaで行う他の方法はありますか??

どんな助けも大歓迎です。

28
Julian C.

整数を除算しています。つまり、整数除算を使用しています。

整数除算では、結果の小数部分は破棄されます。

以下を試してください:

float res = (float) quantity / standard;
            ^^^^^^^

上記は、分子をfloatとして処理することを強制します。これにより、分母も浮動になり、int除算の代わりにfloat除算が実行されます。

リテラルを扱っている場合は、変更できることに注意してください

float f = 6800 / 500;

f接尾辞を含めて、分母を浮動小数点にする:

float f = 6800f / 500;
              ^
75
aioobe

精度が心配な場合は、2桁以上の精度を持つdoubleを使用することをお勧めします。ただし、浮動小数点は、合計または0.5の累乗である分数のみを正確に表します。これは、0.6がほぼ表されることを意味します。これは、適切な丸めで問題になる必要はありません。

double d = (double) 6800 / 500;

または

double d = 6800.0 / 500;
3
Peter Lawrey

私の場合、私はこれをやっていた:

double a = (double) (MAX_BANDWIDTH_SHARED_MB/(qCount+1));

「正しい」の代わりに:

double a = (double)MAX_BANDWIDTH_SHARED_MB/(qCount+1);
1
Felipe Volpato

こんにちは、これを試してみてください。

double percent=(7819140000l-3805200000l)*100f/7819140000l;

public String format_Decimal(double decimalNumber) {
                NumberFormat nf = NumberFormat.getInstance();
                nf.setMaximumFractionDigits(5);
                nf.setMinimumFractionDigits(2);
                nf.setRoundingMode(RoundingMode.HALF_UP);
                String x = nf.format(decimalNumber);
                return x;
        }
0
Chandu D