我已经编写了(如下所示)getCelsius方法,可以将华氏温度转换为摄氏温度,但是当我运行该程序时,它会向我显示一个断言错误。
代码:
课堂温度方法:
public double getCelsius() {
double c = 0;
c = ((this.temp_value - 32) * (5 / 9));
return c;
}
这是TestTemperature类中的方法调用,它给出了一个断言错误:
Temperature t = new Temperature(212.0, "F");
assert t.getCelsius() == 100.0; // < error in this line
帮助!
答案 0 :(得分:7)
有几个问题:首先,5 / 9
部分使用整数除法,因此它将一直返回0。您需要将5 / 9
更改为5f / 9
或类似内容。
其次(212f - 32) * (5f / 9)
并不完全是100.0
:很难进行浮点比较,因为并非所有用Java编写的值都能在IEEE754浮点数中完全表示。因此,您应该比较这两个数字:assert Math.abs(t.getCelsius() - expected) < 0.000001
或其他一些所需的最大差异。
答案 1 :(得分:0)
您需要考虑精度/表示。即执行你的测试:
assert Abs(t.getCelsius() - 100.0) < epsilon;
其中epsilon是你的容忍度(比方说,0.000001)
在处理浮点数时,你应该很少使用精确的相等比较;改为使用宽容。
另外,编写转换因子以使用浮点运算:
c = ((this.temp_value - 32) * (5.0 / 9));
答案 2 :(得分:0)
好吧,如果你想那样的话
// will return "exact" value if input is 212.0 or 32.0
double f2c(double f)
{
return (f-32.0)/(212.0-32.0) * 100.0;
}
assert f2c(212.0)==100.0 ; // true!
assert f2c( 32.0)== 0.0 ; // true!
更一般地说,如果我们有两个端点(x1,y1)
和(x2,y2)
,则此线性插值
y = (x-x2)/(x1-x2) * y1 + (x-x1)/(x2-x1) * y2
将y1
x=x1
评估为“y2
,x=x2
评估为double/float/int/short/byte
。适用于{{1}}