无法从另一个双精度数中减去一个双精度数?

3

我对Java和编程都比较新,但已经花了很多时间研究它。目前我正在制作我的第一个真正的面向对象程序-一个可以执行特定方程的计算器。 然而,在试图编写一个计算分布方差的程序时-以下是代码:

void variance() {
  System.out.println("The variance of a distribution with x values of " + a + b + "and mean" 
                + mean + "is " + a*a+b*b/2 - mean*mean); 
}

我遇到了错误

二元运算符“-”的操作数类型不匹配 第一个类型 = 字符串 第二个类型 = 双精度浮点数。

之前我声明了a、b和mean都是双精度浮点数,并且还说明了mean如何计算。我还尝试将a*a+b*b/2从字符串更改为双精度浮点数,但后来发现如果我将任何整数或双精度浮点数放入a*a+b*b/2中(例如2),我会得到相同的错误。 非常感谢您的帮助 :)


你在哪里声明了 mean - brightintro
在表达式(a*a+b*b/2 - mean*mean)周围加上括号。 - andre
1
顺便提一下,这些是方括号:[],而这些是圆括号:(). - Erick Robertson
4个回答

5
那是因为在Java中,+ 被用于字符串连接操作的重载。你需要在数学表达式周围加上括号。
System.out.println("The variance of a distribution with x values of " + a + b + "and mean" 
 + mean + "is " + (a*a+b*b/2 - mean*mean)); 

1
+1 我可以建议一下,原帖作者实际上想要的是 ((a*a+b*b)/2.0 - mean*mean) - Erick Robertson
他们可能需要那个;我不想用数学上是否正确的公式来混淆问题。 - Lawrence Dol
完美的注释用法...ook ook eek eek。 - Erick Robertson

3
简单来说,你需要这样做:
            + mean + "is " + (a*a+b*b/2 - mean*mean)); 

较详细的答案是Java按照从左到右的顺序计算表达式,因此逐步进行如下操作:
  1. mean + "是" + a*a+b*b/2 - mean*mean
  2. 字符串 + "是" + a*a+b*b/2 - mean*mean
  3. 字符串 + a*a+b*b/2 - mean*mean
  4. 字符串 - mean*mean
编译器在此处停止,因为虽然可以使用+(在第3步)将字符串和数字连接起来,但从字符串中减去数字没有意义。通过在整个算术表达式周围添加括号,这将导致先对算术表达式进行评估,然后再将结果与其余输出字符串连接起来。

+1,但是有一个小问题:Java从左到右计算操作数,根据运算符优先级计算表达式。 - user207421

2

将所有数学表达式括在括号中,并根据 abmean 的实际类型进行判断,最好除以 2.0,以确保执行浮点除法。


0

你正在混合使用 String+ 运算符和 Double 运算符。

尝试这样做:

System.out.println( "The variance of a distribution with x values of " 
    + ( a + b ) + " and mean " 
    + mean + " is " 
    + ( ( a * a + b * b / 2 ) - ( mean * mean )) ); 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接