当前位置: 首页 > 知识库问答 >
问题:

JAVA双变量数学不符合,是bc的二进制表示问题?[复制]

司马弘益
2023-03-14

基本上,这是我必须做的关于矩形的家庭作业。当我需要做简单的数学来计算顶点的x和y值时,问题就来了,例如(x-宽度/2),因为我需要在不止一种方法中使用这些值,所以为了易读性,我在类中为这个简单的数学(x1=(x-宽度/2),x2,y1,y2等)创建了新的变量。出于某种原因,在我的方法中,使用变量会产生错误的结果。当我回去再次用数学替换它们时,它起作用了。

我的问题是为什么我做的变量(在//WEIRD VARIABLES下)在包含方法中不起作用?

这是我的代码

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)
    }
}

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

    boolean contains(MyRectangle2D r){}

这意味着我需要写r.(x-(宽度/2))

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

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

共有2个答案

葛胡媚
2023-03-14

在声明期间,字段的赋值(如x1x2y1y2)是在调用Super()之后和构造函数中的任何其他语句之前完成的。在您的情况下,这发生在xy宽度高度的赋值之前,因此x1x2y1y2将为0,无论您将字段声明放在构造函数之前还是之后。

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

武骁
2023-03-14

下面的任务是在任何构造函数之前完成的。施工人员先来并不重要。首先处理所有字段声明。

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

也许解决问题的办法是在承包商内部进行作业,比如:

//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));
}
 类似资料:
  • 问题内容: 请帮我了解负整数的二进制表示形式。 例如,我们有5。5的二进制表示是。 而且据我了解,-5的二进制表示应该像。 但是输出是。 我有2个问题: 1)为什么这里有这么多位。 2)我真正无法理解的是最后3位。看起来像。即使是+1或-1这将是或 谢谢 问题答案: 您对这些负数应该是什么样的理解是有缺陷的。Java对负数使用二进制补码,而基本规则是取正数,将所有位取反然后加1。那给你带来负面影响

  • 为什么Java字符串被认为是不可变的?我可以说之后将name值更改为

  • 我正在分析一个字符串值,我知道它包含一个数字。 如果它只包含数字,并且它在整数之间。MIN_VALUE和整数。MAX_VALUE我将它解析为int,同样长时间,否则我使用Bigintger。 如果它包含一个十进制值,我想将其解析为double或BigDecimal。 我可以测试字符串中的数值是否“适合”成双精度,因此可以安全地解析为双精度,或者是否需要将其保存在BigDecimal中以防止精度损失

  • 不使用怎么可能执行二进制对数?现在我有了这个它可以工作,但我不能使用。 我能做些什么呢? 重要提示:当我执行Math.log(7)/Math.log(2)时,我得到了2.80XXXXX 所以我这样做了: 我得到了。 函数的返回必须四舍五入,例如,如果解为6.777,则返回必须为7。

  • 我在c编程方面是个新手,我正试图弄清楚更多关于位的知识,二进制E.c.T 例如,我有三个二进制int变量m1=255或11111111;m2=255或11111111(二进制),m3=255或11111111(二进制),m4=0或00000000(二进制)。我试图把所有的主题放在一起到单一的int变量temp。类似于(11111111 11111111 1111111100000000)这里是我的

  • 我想将二进制字符串更改为 我试图找到这个问题的答案,但没能找到。我尝试使用split()。