0

这是我正在测试的课程之一。它一直使 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() 东西通过了,但音量失败了,我不知道为什么。

4

3 回答 3

3

在计算将方程的第一项截断为 的体积时,您正在进行整数除法1。代替

myVolume = (4 / 3) * pi * (Math.pow(myRadius, 3)); // 678.24

myVolume = (4 / 3.0) * pi * (Math.pow(myRadius, 3)); // 904.31

由于浮点不精确,您仍然需要考虑预期值和计算值之间的差异。您可以使用assertEquals允许增量值进行比较的此版本 - 替换

assertTrue(sphere.calculateVolume()== 904.32);

assertEquals(sphere.calculateVolume(), 904.32, .02);
于 2013-09-19T21:57:46.513 回答
3

计算

myVolume = (4/3)*pi*(Math.pow(myRadius,3));

使用整数算术:4/3计算结果为1.

将其更改为

myVolume = (4.0/3)*pi*(Math.pow(myRadius,3));
于 2013-09-19T21:57:48.270 回答
2

除了 4/3 整数问题(我没有发现):以这种方式比较两个 Java 双精度值是不安全的。

如果您使用assertEquals而不是assertTruethen 您可能会看到问题。我打赌它首先计算 4/3,然后截断它。即使你把它们变成双打,它仍然会这样做。

使用此问题中提到的 assertEquals 的重载。

于 2013-09-19T21:58:01.823 回答