VAT を計算したかっただけですが、100 で割って合計価格 (価格 * VAT/100) を取得すると、0.0 が返されます。これが私のコードです:
a.price=sc.nextInt();
a.vat=sc.nextInt();
a.total=a.precio*a.iva/100;
'total' は INT ではなく FLOAT として定義されています
VAT を計算したかっただけですが、100 で割って合計価格 (価格 * VAT/100) を取得すると、0.0 が返されます。これが私のコードです:
a.price=sc.nextInt();
a.vat=sc.nextInt();
a.total=a.precio*a.iva/100;
'total' は INT ではなく FLOAT として定義されています
式を にキャストする必要がありますfloat
。ここでは float リテラルを使用しました100.0f
。
a.total= a.precio*a.iva/100.0f;
整数演算へようこそ。float
またはdouble
値を使用してこれを行いたい場合、おそらく精度BigDecimal
を維持するために使用する必要があります。
Java での "/ 100" 操作には注意してください。これは、計算ミスにつながる可能性があり、コストのかかる操作です (/ 操作は 10 進法ではなく 2 進法で行われると考えてください)。
私は、すべての金額が小数点以下 2 桁の long 値 (たとえば、123.45 ユーロは 12345) である銀行プロジェクトに参加していたので、あなたと同じ操作 ("/ 100") を行う必要がありました。一部の金額はラウンド計算につながることがわかりました... 1 セントも欠けています (これは銀行では受け入れられません)。
ただし、BigDecimal は単純な「movePointLeft」で同じ操作を処理するため、次のコードを使用することをお勧めします。
total = (BigDecimal.valueOf(price * VAT)).moveLeft(2).doubleValue()
整数をキャストする必要があります。そうしないと、結果が に割り当てられる前に整数として計算されa.total
ます。何かのようなもの:
a.total = (float)(a.precio) * (float)(a.iva) / 100;
結果が double になるように、少なくとも 1 つの除算オペランドが float または double でなければなりません。それ以外の場合、除算の結果は整数です。
a.total=a.precio*a.iva/100.0
または、本当にフロートが必要な場合は、いくつかの精度をスキップできます
a.total=(float)(a.precio*a.iva/100.0)
問題は、float 変数に入れているものが整数に対する操作の結果であることです。これは整数です。つまり、a.precio * a.iva / 100
は最初に整数に評価され (ここで精度が失われます)、次にこの整数がa.total
float として割り当てられます。
したがってa.precio * a.iva / 100
、整数値をキャストすることにより、浮動小数点数に対して操作を実行する必要があることを指定する必要があります。
変化する
a.total=a.precio*a.iva/100;
に
a.total= ((float)a.precio)*a.iva/100;