1. ホーム
  2. java

[解決済み】Java double.MAX_VALUE?

2022-02-12 13:31:52

質問

私の課題では、ガス会社のためにガスメーターシステムを作成する必要があり、従業員が新しい顧客アカウントを作成し、名前や単価などのデータを修正し、アカウントからお金を引き出す(入金する)ことができます。

コンストラクタを作成し、オーバーロードのメソッドも追加しましたが、現在、次の名前のメソッドを起動するときに問題が発生しています。 預金 のような他のメソッドでは、ユーザーのアカウントからお金を取ることになっています。 記録単位 これにより、従業員は顧客が使用したガスメーターの数値をインポートし、その顧客の口座の残高を更新することができます。

プリセットされた情報だけでプログラムをテストしたとき、入金方法を開始しようとすると、次のようになります。

Account.deposit(Double.MAX_VALUE);

この意味がよくわからないのですが、どうにかしてこれを乗り越える方法はないでしょうか?

テストデータとコードは以下の通りです。

public class TestGasAccount 

{
    public static void main (String [] args)
    {
        GasAccount Account = new GasAccount (223,"Havana","TQ",1000);

        Account.getAccNo();
        Account.getName();
        Account.getAddress();
        Account.getUnits();
        Account.getBalance();
        Account.recordUnits(1000);
        Account.getUnits();
        Account.getBalance();
        Account.deposit(Double.MAX_VALUE);
    }
}

ブレーク

public class GasAccount 
{
    private int intAccNo;
    private String strName;
    private String strAddress; 
    private double dblBalance;
    private double dblUnits;
    protected double dblUnitCost = 0.02; 

     public GasAccount(int intNewAccNo,String strNewName,String strNewAddress,double dblNewUnits)
     {
         intAccNo = intNewAccNo;
         strName = strNewName;
         strAddress = strNewAddress;
         dblUnits = dblNewUnits;
         dblBalance = dblNewUnits * dblUnitCost;
     }

     public GasAccount (int intNewAccNo, String strNewName, String strNewAddress)
     {
         intAccNo = intNewAccNo;
         strName = strNewName;
         strAddress = strNewAddress;
     }

     public double deposit (Double dblDepositAmount)
     {
        dblBalance = dblBalance - dblDepositAmount; 
        return dblBalance;
     }

     public String recordUnits (double dblUnitsUsed)
     {
         double dblTempBalance;

         dblTempBalance = dblUnitsUsed * dblUnitCost;
         dblBalance = dblBalance + dblTempBalance;
         dblUnits = dblUnits + dblUnitsUsed;

         return "Transaction Successful"; 
     }

     public int getAccNo ()
     {
         System.out.println(intAccNo);
         return intAccNo;
     }

     public String getName()
     {
         System.out.println(strName);
         return strName; 
     }

      public String getAddress()
     {
         System.out.println(strAddress);
         return strName; 
     }

     public double getBalance()
     {
         System.out.println("£"+dblBalance);
         return dblBalance; 
     }

     public double getUnitCost()
     {

         return dblUnitCost;
     }

     public double getUnits ()
     {
         System.out.println(dblUnits);
         return dblUnits;
     }

     public void updateUnitCost (double dblNewUnitCost)
     {
         dblUnitCost = dblNewUnitCost;

     }

}

解決方法は?

ダブル.MAX_VALUE は double が表現できる最大値です (1.7*10^308 程度)。

これは、あるデータ型の可能な最大値を引こうとすると、いくつかの計算問題が発生することになるはずです。

お金を扱う場合、浮動小数点値を使うべきではありませんが、特に丸め誤魔化していると問題が発生します(システム内のお金が多いか少ないかのどちらかになってしまいます)。