Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
简单方程中的Java重复小数_Java - Fatal编程技术网

简单方程中的Java重复小数

简单方程中的Java重复小数,java,Java,我在做一个学校作业,我解一个方程,涉及圆r^2=x^2+y^2的坐标,当r=1时,你通过解y的x值递增。我得到了一个重复的小数,即使我只以十分之一递增。我不知道为什么,我试过几种不同的方法。这是代码 double r = 1; double rSqr; double x = 1; double xSqr; double y; double ySqr; double inc = 0.1; int count = 0; whil

我在做一个学校作业,我解一个方程,涉及圆r^2=x^2+y^2的坐标,当r=1时,你通过解y的x值递增。我得到了一个重复的小数,即使我只以十分之一递增。我不知道为什么,我试过几种不同的方法。这是代码

    double r = 1;
    double rSqr;
    double x = 1;
    double xSqr;
    double y;
    double ySqr;
    double inc = 0.1;
    int count = 0;
    while(x > -r)
    {
        x = r - (count * inc);
        rSqr = Math.pow(r, 2);
        xSqr = Math.pow(x, 2);
        ySqr = rSqr - xSqr;
        y = Math.sqrt(ySqr);
        count++;
        System.out.println(x + " " + y);
    }
输出是这样的

1.0 0.0
0.9 0.4358898943540673
0.8 0.5999999999999999
0.7 0.714142842854285
0.6 0.8
0.5 0.8660254037844386
0.3999999999999999 0.9165151389911681
0.29999999999999993 0.9539392014169457
0.19999999999999996 0.9797958971132712
0.09999999999999998 0.99498743710662
0.0 1.0
-0.10000000000000009 0.99498743710662
-0.20000000000000018 0.9797958971132712
-0.30000000000000004 0.9539392014169457
-0.40000000000000013 0.9165151389911679
-0.5 0.8660254037844386
-0.6000000000000001 0.7999999999999999
-0.7000000000000002 0.7141428428542849
-0.8 0.5999999999999999
-0.9000000000000001 0.43588989435406705
-1.0 0.0
它是浮点表示法

使用as数据类型而不是double来解决您的问题。 但要小心,因为BigDecimal是不可变的

问题是double是不精确的。它使用64位来表示十进制数;有些位用于数字部分,有些位用于指数,但许多看似简单的十进制数无法用这种方式精确表示,例如0.1。更多信息,请参阅

解决此问题的一种方法是使用十进制格式显示数字,这种格式可以将数字四舍五入以便于显示。下面是一些示例代码:

public static void main(String[] args) {
    DecimalFormat decimalFormat = new DecimalFormat("#0.000");
    double d = 1 - .9; // one way to get a repeating decimal floating point number 
    System.out.println(d);
    System.out.println(decimalFormat.format(d));
}
输出:

0.09999999999999998
0.100

期望的输出是什么?问题是什么?谢谢,我还没有读到BigDecimal,所以我会读一读。@Tylerall确切地说-这是一个渲染问题,不是数学问题。在你的职业生涯中,你会遇到很多次这样的情况——总是试着把“做它”代码和“表演它”代码分开,不要因为市场营销中的某些人想让“做它”代码看起来像某种方式而妥协或使其复杂化。哈哈,谢谢。也感谢您解释这是一个渲染问题而不是数学问题。不过严格来说,这是一个数学问题。或者可以,取决于您的要求。由于0.1不是您所认为的那样,我有一个循环无法迭代预期次数。
0.09999999999999998
0.100