CURRENCY - それは2つ以上の小数点以下の桁数を持つ場合にのみラウンドdouble値

ディラン:

私は、この法案でも量で分割した場合、それぞれの人が借りてどのくらい計算するには法案や必要性を分割しようとしています。私は1つの量が失われたセントのアカウントへの残りの部分とは異なることがわかっています。

3人は200 3分の200は66.6666666667であるために法案を分割しようとすると仮定します。私が行う上で計画して66.67 2最初の人を充電し、最後は66.66法案と幸運取得されました。

分で、私はこれまでのところ、これを持っています:

private String calculateAmountToPay(String noOfParticipants, String owed) {
    double amountOwed = Double.parseDouble(owed);
    int noOfMembers = Integer.parseInt(noOfParticipants);
    DecimalFormat amountFormat = new DecimalFormat("#.##");
    amountFormat.setRoundingMode(RoundingMode.CEILING);
    return amountFormat.format((amountOwed/(double)noOfMembers) / 100);
  }

しかし、これは常に66.67を返します。小数点以下2桁よりも数の大きいがあれば、それは例えば66.66のままではない場合、私は、唯一のラウンドアップにそれを得ることができるという方法はありますか?

たぶん私は間違った方法これを近づいています。私は、通貨がに対処するため細心の注意することができ知っています。

ボヘミアン:

算術演算についても、思考する前に、あなたはそれを知っている必要がdoubleありません、それのために、通貨で使用するための適切なデータ型不正確したがって、浮動小数点型(例えば、使用停止doubleの量のデータ型など)ドルと正確タイプ(例えば、使用開始longの量のデータ型など)セント

その後、計算を行うための手順は、直ちにセントに、丸めて、すべてを変換するために、次のようになります。

double amountOwed = ...;
int noOfMembers = ...;
long centsOwed = Math.round(amountOwed * 100);
long portionCents = Math.round(amountOwed * 100 / noOfMembers);
long errorCents = portionCents * noOfMembers - centsOwed;

ここでエラーに対処するための一つの方法です:

long lastPortionCents = portionCents - errorCents;

それはよりよい解決策は、最初(または最後、あるいはランダムに選択される)から減算(又は誤差が負の場合追加)によって均等に1セントを誤りを分散することであろうように、エラーが、1以上セントであることが可能だerrorCents食事。

溶液の残りを、私は読者に残した、上記の胸が張り裂けるについて、その後です。

注意点として、セントを使用すると、銀行は(EFTPOSための少なくともとにかく)量を送信する方法です。


基本ソフトウェアの設計に関しては、私はセント、人々がそのパラメータとしてカウント整数受け入れ、「スプリット」量の配列を返す別のメソッドを作成します。これを行うと読んで、あなたのコードが簡単になりますだけでなく、算術演算をcompartmentaiseので、あなたはあなたがカバーさについて考えることができることを、すべてのエッジケースを持って知ることができますので、より簡単に書くことにする簡単なテストの多くを可能にします。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=187506&siteId=1