【问题标题】:Operator * cannot be applied to double运算符 * 不能应用于双精度
【发布时间】:2015-01-20 22:51:59
【问题描述】:
public void onClick(View v){
    switch(v.getId()){
        case R.id.bereken:

           EditText basis = (EditText)findViewById(R.id.Basis);
              String tussenBasis = basis.getText().toString();
                Double.valueOf(tussenBasis);
            //

            EditText hoogte = (EditText)findViewById(R.id.Hoogte);
              String tussenHoogte = hoogte.getText().toString();
                Double.valueOf(tussenHoogte);

            double half = 1 / 2;
            //half = 0,5

            double einde = half * basis * hoogte;
            //eind antwoord formule

            ((TextView)findViewById(R.id.antwoord)).setText("Het antwoord is: " + einde);
            break;
    }

     }
}

我正在尝试为三角形的面积制作一个简单的计算器,但我似乎被困在这里。

【问题讨论】:

  • 阅读 full 错误消息并注意 all/both 类型。为什么它们不能与乘法“一起玩”?
  • 不要在标题中添加“已解决”。表明这一点的 Stack Overflow 方法是单击为您解决问题的答案旁边的“勾号”图标。

标签: java android operator-keyword multiplication


【解决方案1】:

half * basis 是非法的,因为 basisEditText 类型(hoogte 也是如此)你想将 half 乘以什么?也许您需要将Double.valueOf(tussenBasis)Double.valueOf(tussenHoogte) 的结果分配给double 变量并在乘法中使用它?

EditText basis = (EditText)findViewById(R.id.Basis);
String tussenBasis = basis.getText().toString();
double basisDouble = Double.valueOf(tussenBasis);
//

EditText hoogte = (EditText)findViewById(R.id.Hoogte);
String tussenHoogte = hoogte.getText().toString();
double hoogteDouble = Double.valueOf(tussenHoogte);

double half = 1d / 2d;
//half = 0,5

double einde = half * basisDouble * hoogteDouble;

还要注意从 double half = 1 / 2;double half = 1d / 2d; 的变化

(根据 OP 的评论进行编辑)您需要使用 d 的“类型后缀”来指定您的文字(字符 12)是 double literals(参见 @987654322 @“The Java Tutorials > Primitive Data Types”的部分以获得更简单的英文解释)。

没有它,它们将被解释为整数文字。具有两个整数变量的算术运算符会导致执行整数除法(由于binary numeric promotion 将它们都视为整数)。这给出了0 的结果(作为整数)。只有这样,结果才会在assignment conversion 期间扩大(使用widening primitive converstion)到两倍。

【讨论】:

  • 我知道否则结果会为零,因此您添加了“d”,但它们代表什么?
  • @MalumAtire832 看到我的编辑解释你为什么需要它们。一般情况下,使用类型后缀f 指定分配给float 的编号,使用d 分配给double 和使用L 分配给longint 不需要后缀。
【解决方案2】:
EditText basis = (EditText)findViewById(R.id.Basis);

不是可以在算术中使用的值。与:

EditText hoogte = (EditText)findViewById(R.id.Hoogte);

你在这里尝试使用它们double einde = half * basis * hoogte;

这是不可能的。

我很确定您需要将这些值保存到变量中

Double.valueOf(tussenHoogte);
Double.valueOf(tussenBasis);

然后在你的算术中使用这些变量

【讨论】:

    【解决方案3】:

    你有 * hoogtie 和 base 是 EditText 并且不能相乘。

    【讨论】:

      【解决方案4】:

      当您执行Double.valueOf 时,您需要将结果分配给某物。就这样吧。

      EditText basis = (EditText)findViewById(R.id.Basis);
      String tussenBasis = basis.getText().toString();
      double basisValue = Double.valueOf(tussenBasis);
      

      hoogte 类似。然后就可以写了

      double einde = half * basisValue * hoogteValue;
      

      【讨论】:

        【解决方案5】:

        您正在从EditText 中提取值,但您没有使用您在此行中解析的double 值,例如:

        Double.valueOf(tussenBasis);
        

        您正在尝试使用EditText 本身作为一个因子,但它不是double,因此它不能与* 运算符一起使用来将值相乘。

        Double.valueOf 的结果分配给新的double 变量,并在计算中使用这些变量。

        顺便说一下,1 / 2 在 Java 中是整数除法,计算结果为 0。试试1.0/2.0 或直接使用0.5

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-09-24
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多