1

VAT を計算したかっただけですが、100 で割って合計価格 (価格 * VAT/100) を取得すると、0.0 が返されます。これが私のコードです:

        a.price=sc.nextInt();

        a.vat=sc.nextInt();

        a.total=a.precio*a.iva/100;

'total' は INT ではなく FLOAT として定義されています

4

6 に答える 6

19

式を にキャストする必要がありますfloat。ここでは float リテラルを使用しました100.0f

a.total= a.precio*a.iva/100.0f;
于 2013-06-06T11:46:11.340 に答える
8

整数演算へようこそ。floatまたはdouble値を使用してこれを行いたい場合、おそらく精度BigDecimalを維持するために使用する必要があります。

于 2013-06-06T11:47:37.507 に答える
7

Java での "/ 100" 操作には注意してください。これは、計算ミスにつながる可能性があり、コストのかかる操作です (/ 操作は 10 進法ではなく 2 進法で行われると考えてください)。

私は、すべての金額が小数点以下 2 桁の long 値 (たとえば、123.45 ユーロは 12345) である銀行プロジェクトに参加していたので、あなたと同じ操作 ("/ 100") を行う必要がありました。一部の金額はラウンド計算につながることがわかりました... 1 セントも欠けています (これは銀行では受け入れられません)。

ただし、BigDecimal は単純な「movePointLeft」で同じ操作を処理するため、次のコードを使用することをお勧めします。

total = (BigDecimal.valueOf(price * VAT)).moveLeft(2).doubleValue()
于 2016-08-09T12:07:04.940 に答える
2

整数をキャストする必要があります。そうしないと、結果が に割り当てられる前に整数として計算されa.totalます。何かのようなもの:

a.total = (float)(a.precio) * (float)(a.iva) / 100;
于 2013-06-06T11:46:56.607 に答える
2

結果が double になるように、少なくとも 1 つの除算オペランドが float または double でなければなりません。それ以外の場合、除算の結果は整数です。

a.total=a.precio*a.iva/100.0

または、本当にフロートが必要な場合は、いくつかの精度をスキップできます

a.total=(float)(a.precio*a.iva/100.0)
于 2013-06-06T11:47:15.687 に答える
2

問題は、float 変数に入れているものが整数に対する操作の結果であることです。これは整数です。つまり、a.precio * a.iva / 100は最初に整数に評価され (ここで精度が失われます)、次にこの整数がa.totalfloat として割り当てられます。

したがってa.precio * a.iva / 100、整数値をキャストすることにより、浮動小数点数に対して操作を実行する必要があることを指定する必要があります。

変化する

a.total=a.precio*a.iva/100;

a.total= ((float)a.precio)*a.iva/100;
于 2013-06-06T11:45:48.030 に答える