【问题标题】:Can anyone tell me why this is evaluating to 0?谁能告诉我为什么评估为 0?
【发布时间】:2016-04-25 18:04:43
【问题描述】:

在 Java 类上工作,这让我抓狂,因为这个表达式的计算结果为零,我需要它计算为 double,然后将其向下舍入到最接近的 int。所以我想要得到的是天数是整数天,但是当我通过 java 运行它时,它评估为 0。当我通过我的计算器运行它时,它评估为正确的值。我很想修复并解释为什么我已经拥有的东西不起作用。

public int getEventDays(){
     //variables
     double daysCalc; 
     int days;

     //logic
     if (getStatus().equals("filling")){
        //this is indented less to fit everything on one line, its not this way in 
        //the fractions are for unit conversion 
        daysCalc= Math.floor(((capacity-storage)/(inflow-outflow))*(43560)*(1/3600)*(1/24));
        days = (int)daysCalc; 

     }
     else if (getStatus().equals("emptying")){
        //this is indented less to fit everything
        //the fractions are for unit conversion 
        daysCalc=Math.floor(((storage-0)/(outflow-inflow))*(43560)*(1/3600)*(1/24)); 
        days = (int)daysCalc;
     }
     else{
         days = -1;
     }

     return days;


}

【问题讨论】:

  • if (getStatus() == "filling"){ 你不能像那样比较字符串...我希望它总是返回-1。你怎么打电话/你怎么知道它返回 0?
  • 1/36000。试试1D/3600。 1D 可能已经正式解散,但他们可以通过我们的代码继续存在(以及 1D/24 也是)
  • 虽然它现在不会导致您的问题,但How do I compare strings in Java? 将帮助您避免将来出现问题。
  • @John3136 我在 jgrasp 上运行了一些名为 getEventDay() 的测试代码上的调试器,当我单步执行它时,我看到它的评估结果为 0
  • 不,当然不是。但这不是贝卡的问题。这是需要修复的整数除法。

标签: java unit-conversion


【解决方案1】:

将您的代码更改为:

daysCalc = Math.floor(((storage-0)/(outflow-inflow))*(43560)*(1.0/3600)*(1.0/24));

解释

右边的表达式返回一个整数值。在您的情况下,1/3600 舍入为 0,类似于 1/24 的情况。 现在通过使用 1.0 而不是 1,它给出了 1/3600 的未舍入浮点值。

【讨论】:

    【解决方案2】:

    您的问题与表达式中的操作顺序有关。 1/36001/24 周围的括号导致首先计算这些表达式 - 由于每个除法在除法的任一侧都有一个整数类型的表达式,因此它被视为整数除法。换句话说,1/36001/24 都被计算为整数,结果为零。这意味着您的算术包括几次乘以零,这就是您的结果为零的原因。

    最简单的解决方法是了解乘以某个数字的倒数与除以该数字相同。换句话说,您可以将计算简化为

    daysCalc = Math.floor( storage / ( outflow - inflow ) * 43560 / 3600 / 24 );
    

    如果storageoutflowinflow 不都是整数,这将给出正确的结果。

    另一方面,如果storageoutflowinflow 都是整数,那么您需要确保第一个除法也不会被视为整数除法。你可以通过写来做到这一点

    daysCalc = Math.floor((double) storage / ( outflow - inflow ) * 43560 / 3600 / 24 );
    

    强制使用浮点运算进行除法;之后,每一个除法都以浮点数完成。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-03-22
      • 1970-01-01
      • 2017-05-03
      • 1970-01-01
      • 2019-05-24
      • 1970-01-01
      • 2021-01-18
      相关资源
      最近更新 更多