这是我正在测试的课程之一。它一直使calculateVolume()方法失败,我不知道为什么。
package shape3D;
public class Sphere implements Cloneable {
private double myRadius;
private double myVolume;
private double mySurfaceArea;
private final static double pi = 3.14;
public static void main(String args[]){
Sphere sphere = new Sphere();
}
public double calculateVolume(){
myVolume = (4/3)*pi*(Math.pow(myRadius,3));
return myVolume;
}
public double calculateSurfaceArea(){
mySurfaceArea = ((4)*(pi)*(Math.pow(myRadius,2)));
return mySurfaceArea;
}
public double getSurfaceArea(){
return this.calculateSurfaceArea();
}
public double getVolume(){
return this.calculateVolume();
}
public void setRadius(double radius2){
myRadius = radius2;
}
public String toString(){
return "Volume: " + this.getVolume() + " Surface area " + this.getSurfaceArea();
}
public Sphere clone (){
Sphere p = new Sphere();
p.setRadius(myRadius);
return p;
}
}
这是我正在使用的JUnit测试用例
public class sphereTest {
@Test
public void testSphere(){
shape3D.Sphere sphere = new shape3D.Sphere();
sphere.setRadius(6);
assertTrue(sphere.calculateSurfaceArea()== 452.16);
assertTrue(sphere.calculateVolume()== 904.32);
calculateSurfaceArea()的东西传递正常,但音量失败,我不知道为什么。
答案 0 :(得分:3)
在计算将方程的第一项截断为1
的体积时,您正在进行整数除法。取代
myVolume = (4 / 3) * pi * (Math.pow(myRadius, 3)); // 678.24
与
myVolume = (4 / 3.0) * pi * (Math.pow(myRadius, 3)); // 904.31
由于浮点不精确,您仍然需要考虑到预期和&之间的差异。计算值。您可以使用此版本的assertEquals
,它允许delta值进行比较 - 替换
assertTrue(sphere.calculateVolume()== 904.32);
与
assertEquals(sphere.calculateVolume(), 904.32, .02);
答案 1 :(得分:3)
计算
myVolume = (4/3)*pi*(Math.pow(myRadius,3));
使用整数运算:4/3
计算结果为1
。
将其更改为
myVolume = (4.0/3)*pi*(Math.pow(myRadius,3));
答案 2 :(得分:2)
除了4/3整数问题(我没有发现):用这种方式比较两个Java double值是不安全的。
如果您使用assertEquals
代替assertTrue
,那么您可能会看到问题。我打赌它首先计算4/3,然后截断它。即使你把它们变成双打,它仍然会这样做。
使用this question中提到的assertEquals重载。