Java double.MAX_VALUE?

Для выполнения моего задания я должен создать систему газовых счетчиков для газовой компании, которая позволит сотрудникам создавать новые учетные записи клиентов и вносить изменения в такие данные, как имя и стоимость единицы, а также брать (вносить) деньги со своего счета.

Я создал свой конструктор и даже добавил метод перегрузки, хотя в настоящее время у меня возникает проблема при запуске одного из моих методов, который я назвал deposit, предполагается, что он берет деньги со счета пользователя, тогда как другие методы, такие как recordUnits, позволяют Сотрудник импортирует показания счетчика газа о количестве единиц, использованных клиентом, и обновляет остаток на счете этого клиента, что, по сути, является тем, что клиент должен компании.

Когда я тестирую программу, используя только предустановленную информацию, при попытке инициировать метод депозита, я получаю это

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;

     }

}

Ответ 1

Double.MAX_VALUE - это максимальное значение, которое может представлять double (где-то около 1.7 * 10 ^ 308).

Это должно закончиться некоторыми проблемами вычисления, если вы попытаетесь вычесть максимально возможное значение типа данных.

Даже если вы имеете дело с деньгами, вы никогда не должны использовать значения с плавающей запятой, особенно если округление может вызвать проблемы (тогда вам придется либо много или меньше денег в вашей системе).

Ответ 2

Воскресение мертвых здесь, но на всякий случай кто-то наткнется на это, как я. Я знаю, где взять максимальное значение двойного числа, (более) интересная часть была о том, как они достигли этого числа.

double имеет 64 бита. Первый зарезервирован для знака.

Следующие 11 представляют показатель степени (то есть 1023 смещения). Это просто еще один способ представить положительные/отрицательные значения. Если есть 11 битов, то максимальное значение составляет 1023.

Тогда есть 52 бита, которые содержат мантиссу.

Это легко вычислить, например, так:

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

} 

Вы также можете доказать это в обратном порядке:

    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

Ответ 3

это означает, что Account.deposit(Double.MAX_VALUE); он устанавливает значение депозита в значение MAX Double dataType.to procced для запуска тестов.