【问题标题】:Calculations always equal 0计算总是等于 0
【发布时间】:2015-12-13 14:22:55
【问题描述】:

我有这段代码,每当我输入任何值时,结果总是显示为 0。我在每个 if 语句中设置断点,计算中使用的值始终有效,但仍然是 liming 还可能值得注意的是soilDepthrnv 是整数。为了以防万一,我尝试将它们转换为双打,但没有任何改变。

final TextView limingTV = (TextView) findViewById(R.id.limingText);

double liming;

if (targetPh == 6.8) {
    liming = (71.4 - 1.03 * bufferpH * 10) * (soilDepth / 8) * (65 / rnv);
} else if (targetPh == 6.5) {
    liming = (60.4 - .87 * bufferpH * 10) * (soilDepth / 8) * (65 / rnv);
} else if (targetPh == 6.0) {
    liming = (49.3 - .71 * bufferpH * 10) * (soilDepth / 8) * (65 / rnv);
} else { //If 6.8 is left as default on drop down menu its not passed
    liming = (71.4 - 1.03 * bufferpH * 10) * (soilDepth / 8) * (65 / rnv);
}

limingTV.setText(String.format("%.4f lbs/acre", liming));

【问题讨论】:

    标签: android int double calculator


    【解决方案1】:

    整数除法可能导致 0 值。

    尝试类似 -

    double result = ((double)x) / y;
    

    您需要将 soilDepth 和 rnv 之一或两者转换为双精度值。

    要添加更多,你也可以试试这个(不强制转换)

    double result = x * 1.0/y;
    

    【讨论】:

      【解决方案2】:

      就像 Bhush_Techidiot 说的,在数学开始之前强制加倍。带整数的 Div 不能像您期望的那样工作。

        final TextView limingTV = (TextView) findViewById(R.id.limingText);
      
        double liming;
        double dblSoilDepth = (double) soilDepth;
        double dblRnv = (double) rnv;
      
        if (targetPh == 6.8) {
            liming = (71.4 - 1.03 * bufferpH * 10) * (dblSoilDepth / 8) * (65 / dblRnv);
        } else if (targetPh == 6.5) {
            liming = (60.4 - .87 * bufferpH * 10) * (dblSoilDepth / 8) * (65 / dblRnv);
        } else if (targetPh == 6.0) {
          liming = (49.3 - .71 * bufferpH * 10) * (dblSoilDepth / 8) * (65 / dblRnv);
        } else { //If 6.8 is left as default on drop down menu its not passed
          liming = (71.4 - 1.03 * bufferpH * 10) * (dblSoilDepth / 8) * (65 / dblRnv);
        }
      
        limingTV.setText(String.format("%.4f lbs/acre", liming));
      

      【讨论】:

      • 就像我在帖子末尾所说的那样,我确实尝试过,但是 liming 仍然是 0。'code'else { //如果在下拉菜单中将 6.8 保留为默认值,则它没有通过 liming = (71.4 - 1.03 * bufferpH * 10.0) * (double)(soilDepth / 8) * (double)(65 / rnv); Log.v("liming is", String.valueOf(liming)); } // Liming is : 0.0
      • @CodyHarness : (double)(soilDepth / 8) 将不起作用,因为您将 (soilDepth / 8) 的结果转换为 doubleNOT soilDepth。换句话说,您仍在执行整数除法(导致结果为 0),然后将 THAT 转换为 double,给出 0.0
      • @Squonk 啊,做到了。我仍然不确定我是否理解为什么它会导致问题,如果我要输入类似 16 的土壤深度。
      • @CodyHarness 假设intNumber = 10;。当您将一个数字除以整数时,结果将是整数。现在,当您编写(double)(9/intNumber) 时,第二个括号的结果是一个 int,在这种情况下为 0,将其转换为 double 没有区别。但是在(9/ (double) intNumber) 中,首先将 intNumber 强制转换为 double,然后进行除法。所以结果将是双倍 (0.9) 而不是 0 实际上。
      • @NavidEivazzadeh 我将您的想法添加到我的答案中
      【解决方案3】:

      在计算结果之前尝试将ints 转换为double

      double newSoilDepth = (double) soilDepth;
      double newRnv = (double) rnv;
      

      然后在计算中使用新的双精度数。这可以导致更清晰的代码。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-06
        相关资源
        最近更新 更多