I am havin an issue with the findVolume for the sphere part. It seems to ignore the "4/3" part but calculates everything else. Is there a way I can make it include this function?

Here is the code:

public class Sphere extends threeDShape{
    double r;
    public Sphere(double x, double y, double r){
        super(x, y, r, r, r);
        this.r = r;
    }
    public double findArea(){
        return(double)((4*3.14*r*r));
    }
    public double findVolume(){
        return (double)(4/3*3.14*r*r*r);

    }
    public double getR() {
        return r;
    }

    public void setR(double r) {
        this.r = r;
    }

    @Override
    public String toString() {
        return String.format("The area of the sphere is: " + findArea() +
                "\nThe volume of the sphere is: " + findVolume());
    }
}

Expression is evaluated with / and * same priority, left to right, is as
((((4/3)*3.14)*r)*r)*r
The first part is 4/3, which is two ints, so evaluated in int arithmetic, ie = 1
It doesn't switch to floating point until you get to the *3.14

You can rearrange the formula so the first part to be evaluated goes straight into floating point...

Edited 3 Years Ago by JamesCherrill

How would I rearrange it? I tried doing double n = 4/3; int n = 4/3; (3.14 * rrr) * 4/3; And still no luck.

Something as simple as swapping round the first couple of terms will do it: 3.14*4/3*r*r*r - the first thing to be evaluated is 3.14*4, which will be done in floating point, so then dividing that by 3 will also be done in floating point

Oh, now I see, thank you very much :) I will keep in mind that a/b will be = 1 (Java is confusing :P)
By the way, the way you showed me worked and after I saw how you did it, I tried another way which worked:

    public double findVolume(){
        return (double)(4*3.14*r*r*r)/3;

Yes, that's just as good. The rule is simple - operations with two ints are evaluated as integer arithmetic, operations with one or more floating point are evaluated in floating point.

This article has been dead for over six months. Start a new discussion instead.