Java 断言错误

Java 断言错误,java,Java,我已经编写了(如下所示)一个方法getCelsius来将华氏温度转换为摄氏温度,但是当我运行程序时,它会显示一个断言错误 代码: 课堂教学方法: public double getCelsius() { double c = 0; c = ((this.temp_value - 32) * (5 / 9)); return c; } 下面是TestTemperature类中的方法调用,它给了我一个断言错误: Temperature t

我已经编写了(如下所示)一个方法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
温度t=新温度(212.0,“F”);
断言t.getCelsius()==100.0;//<这行有错误

救命啊

您需要考虑精度/表示。i、 e.按照以下方式进行测试:

assert Abs(t.getCelsius() - 100.0) < epsilon;

您需要考虑精度/表示。i、 e.按照以下方式进行测试:

assert Abs(t.getCelsius() - 100.0) < epsilon;

有两个问题:首先,
5/9
部分使用整数除法,因此它将始终返回0。您需要将
5/9
更改为
5f/9
或类似内容


其次,
(212f-32)*(5f/9)
并不完全是
100.0
:很难进行浮点比较,因为不是所有可以用Java编写的值都可以用IEEE754浮点数表示。因此,您应该像这样比较这两个数字:
assert Math.abs(t.getCelsius()-expected)<0.000001
或其他一些所需的最大差异。

有两个问题:首先,
5/9
部分使用整数除法,因此它将始终返回0。您需要将
5/9
更改为
5f/9
或类似内容


其次,
(212f-32)*(5f/9)
并不完全是
100.0
:很难进行浮点比较,因为不是所有可以用Java编写的值都可以用IEEE754浮点数表示。因此,您应该像这样比较这两个数字:
assert Math.abs(t.getCelsius()-expected)<0.000001
或其他一些所需的最大差异。

如果您希望这样做的话

// 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 

将在
x=x1
处对
y1
进行“精确”计算,在
x=x2
处对
y2
进行计算。对double/float/int/short/byte有效,如果您需要的话

// 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 
将在
x=x1
处对
y1
进行“精确”计算,在
x=x2
处对
y2
进行计算。对双精度/浮点数/整数/短字符/字节有效