断言错误

时间:2011-04-24 03:48:06

标签: java

我已经编写了(如下所示)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

帮助!

3 个答案:

答案 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评估为“y2x=x2评估为double/float/int/short/byte。适用于{{1}}