JAVA双变量数学不算数,是二进制表示问题的bc吗?

JAVA double variable math does not tally, is it bc of binary representation issues?

本问题已经有最佳答案,请猛点这里访问。

基本上这是一个关于矩形的家庭作业。当我需要做简单的数学运算来计算顶点的x和y值(例如(x-width/2),并且因为我需要在多个方法中使用这些值,我在类中为这个简单的数学创建了新的变量(x1=(x-width/2),x2,y1,y2等),以提高可读性。出于某种原因,在我的方法中,使用变量产生了错误的结果。当我回去用数学代替它们的时候,它起了作用。

我的问题是,为什么我创建的变量(在//奇怪的变量下)不在contains方法中工作?

这是我的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
package com.example;

public class MyRectangle2D {
    double x,y;
    double width, height;
    //a couple of getters and setters
    //constructor
    MyRectangle2D(){
        x=0.0;
        y=0.0;
        width=1.0;
        height=1.0;
    }
    MyRectangle2D(double X, double Y, double Width, double Height){
        x=X;
        y=Y;
        width=Width;
        height=Height;
    }

    // WEIRD VARIABLES
    private double x1 = x-(width/2);
    private double x2 = (x+(width/2));
    private double y1 = (y-(height/2));
    private double y2 = (y+(height/2));

    //methods
    boolean contains(double X, double Y){
        /* initially wrote:
           return (!( X<x1 || X>x2 || Y <y1 || Y>y2 ));
           didnt work, bc for some reason x1,x2,y1,y2 were all 0.0
           the below works well: */

        return (!(X<(x-(width/2)) || X>(x+(width/2)) || Y <(y-(height/2)) || Y>(y+(height/2))));
    }


    public static void main(String[] args) {
        MyRectangle2D b = new MyRectangle2D(1, 2, 3, 4);
        System.out.println(b.x1); // 0.0 (should be -0.5)
        System.out.println(b.x); // 1.0 (correct)
        System.out.println(b. width); // 3.0 (correct)
        System.out.println("(1.0,2.0) in b? (true?)" + b.contains(1.0,2.0)); //true (correct)
    }
}

我很好,只是一次又一次地把数学写出来,但是在我的家庭作业中,他们希望我创建一个方法来检查这个矩形是否包含另一个矩形,比如

1
    boolean contains(MyRectangle2D r){}

这意味着我需要写r.(x-(width/2))<=(x-(width/2))等来写我的条件,这看起来既单调又混乱。在我看来,创建x1、x2、y1、y2变量作为一种快捷方式似乎是合乎逻辑的,因为数学公式是相同的,而且更清晰,我可以直接使用r.x1而不是r。(x-(width/2))。

tl;dr:当我打印ln x1时,它给我0.0,但当我打印ln x(宽度/2)时,它给我-0.5,这是正确的。

我一直想知道为什么数学出了问题,但我还是迷路了。任何帮助都将不胜感激!


下面的分配是在任何构造函数之前完成的。构造器排在第一并不重要。首先处理所有字段声明。

1
2
3
4
5
 // WEIRD VARIABLES
    private double x1 = x-(width/2);
    private double x2 = (x+(width/2));
    private double y1 = (y-(height/2));
    private double y2 = (y+(height/2));

也许你的问题的解决办法是在承包商内部完成任务,比如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//declare the filds outside any method
private double x1;
private double x2;
private double y1;
private double y2;

MyRectangle2D(){
   //... Your normal code here
   buildWeird();
}
MyRectangle2D(double X, double Y, double Width, double Height){
    //... Your normal code here
    buildWeird();
}
private void buildWeird(){
    this.x1 = x-(width/2);
    this.x2 = (x+(width/2));
    this.y1 = (y-(height/2));
    this.y2 = (y+(height/2));
}


在声明期间(如x1x2y1y2的字段分配是在调用super()之后和在构造函数中的任何其他语句之前完成的。在您的情况下,这发生在xywidthheight的赋值之前,所以x1x2y1y2将为0,无论您在构造函数之前还是之后放置字段声明。

解决方案是在最后移动构造函数中的赋值。