首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >爪哇double.MAX_VALUE?

爪哇double.MAX_VALUE?
EN

Stack Overflow用户
提问于 2013-04-22 11:36:08
回答 3查看 268.2K关注 0票数 26

在我的任务中,我必须为一家煤气公司创建一个煤气表系统,允许员工创建新的客户账户,并修改数据,如姓名和单位成本,以及从他们的账户中提取(存)钱。

我已经创建了我的构造函数,甚至添加了一种重载方法--尽管我目前在启动我的一种名为deposit()的方法时遇到了问题,这应该是从用户帐户中取钱,而其他方法,比如recordUnits(),则允许员工输入一个用户使用过多少单位的燃气表读数,并更新客户帐户的余额,这基本上就是客户欠公司的钱。

在尝试启动存款方法时,使用预置信息测试程序时,我会得到以下信息

代码语言:javascript
复制
Account.deposit(Double.MAX_VALUE);

我不太确定这意味着什么,而且似乎找不到通过它的任何方式!

测试数据和代码如下:

代码语言:javascript
复制
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;
     }
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-04-22 11:50:40

价值是double可以表示的最大值(大约在1.7*10^308左右)。

如果您试图减去数据类型的最大可能值,这应该会导致一些计算问题。

即使当您处理货币时,您也不应该使用浮点值,特别是在舍入时,这可能会导致问题(那么,您的系统中可能需要更多的或更少的钱)。

票数 40
EN

Stack Overflow用户

发布于 2016-11-08 12:28:47

在这里复活死者,以防万一有人像我一样碰到这件事。我知道在哪里得到一个双的最大值,(更多的)有趣的部分是他们是如何得到那个数字的。

双人有64位。第一个是为标志预留的。

接下来的11表示指数(即1023有偏)。这只是另一种表示正/负价值的方法。如果有11位,则最大值为1023。

然后,有52位持有尾数。

这很容易像这样计算,例如:

代码语言:javascript
复制
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);

} 

你也可以用相反的顺序证明这一点:

代码语言:javascript
复制
    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
票数 16
EN

Stack Overflow用户

发布于 2013-04-22 11:42:04

这说明Account.deposit(Double.MAX_VALUE);正在将存款值设置为用于运行测试的Double dataType.to的最大值。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16146219

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档