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)); } |
号
在声明期间(如
解决方案是在最后移动构造函数中的赋值。