it-swarm.com.de

Java double.MAX_VALUE?

Für meinen Auftrag muss ich ein Gaszählersystem für ein Gasunternehmen erstellen, damit Mitarbeiter neue Kundenkonten erstellen und Daten wie Name und Stückkosten ändern sowie Geld von ihrem Konto abheben (einzahlen) können.

Ich habe meinen Konstruktor erstellt und sogar eine Methode zum Überladen hinzugefügt, obwohl ich gerade auf ein Problem stoße, als ich eine meiner Methoden mit dem Namen deposit initiiere. Dies soll den Benutzern Geld abnehmen Konto, während andere Methoden wie recordUnits dem Mitarbeiter ermöglichen, einen Gaszählerstand zu importieren, der angibt, wie viele Einheiten der Kunde hat verwendet und aktualisiert den Saldo dieses Kundenkontos, was im Wesentlichen dem Kunden das Unternehmen schuldet.

Beim Testen des Programms mit nur voreingestellten Informationen beim Einleiten der Einzahlungsmethode erhalte ich diese

Account.deposit(Double.MAX_VALUE);

Ich bin mir nicht sicher, was das bedeutet und kann es ohnehin nicht finden, darüber hinwegzukommen!

testdaten und Code siehe unten:

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);
    }
}

brechen

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;

     }

}
18
Kriss Brown

Double.MAX_VALUE ist der Maximalwert, den ein Double darstellen kann (ungefähr 1,7 * 10 ^ 308).

Dies sollte zu einigen Berechnungsproblemen führen, wenn Sie versuchen, den maximal möglichen Wert eines Datentyps zu subtrahieren.

Auch wenn Sie mit Geld zu tun haben, sollten Sie niemals Gleitkommawerte verwenden, insbesondere beim Runden. Dies kann zu Problemen führen (dann haben Sie entweder zu viel oder zu wenig Geld in Ihrem System).

24
Kuchi

Hier die Toten auferwecken, aber nur für den Fall, dass jemand wie ich dagegen stolpert. Ich weiß wo man den Maximalwert eines Doppelten bekommt, der (interessantere) Teil war, wie man zu dieser Zahl kommt.

double hat 64 bits. Der erste ist für das Schild reserviert.

Die nächsten 11 repräsentieren den Exponenten (dh 1023 voreingenommen). Es ist nur eine andere Art, die positiven/negativen Werte darzustellen. Bei 11 Bits beträgt der Maximalwert 1023.

Dann gibt es 52 Bits, die die Mantisse halten.

Dies lässt sich leicht wie folgt berechnen:

public static void main(String[] args) {

    String test = Strings.repeat("1", 52);

    double first = 0.5;
    double result = 0.0;
    for (char c : test.toCharArray()) {
        result += first;
        first = first / 2;
    }

    System.out.println(result); // close approximation of 1
    System.out.println(Math.pow(2, 1023) * (1 + result));
    System.out.println(Double.MAX_VALUE);

} 

Sie können dies auch in umgekehrter Reihenfolge nachweisen:

    String max = "0" + Long.toBinaryString(Double.doubleToLongBits(Double.MAX_VALUE));

    String sign = max.substring(0, 1);
    String exponent = max.substring(1, 12); // 11111111110
    String mantissa = max.substring(12, 64);

    System.out.println(sign); // 0 - positive
    System.out.println(exponent); // 2046 - 1023 = 1023
    System.out.println(mantissa); // 0.99999...8
8
Eugene

dies besagt, dass Account.deposit(Double.MAX_VALUE); den Einzahlungswert auf den MAX-Wert von Double dataType setzt, um für die Ausführung von Tests verarbeitet zu werden.

1
NPKR