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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.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_Decimal - Fatal编程技术网

Java 奇怪的十进制输出

Java 奇怪的十进制输出,java,decimal,Java,Decimal,好吧,我想这个计划会很简单。但是,当控制台显示system.out.中显示的x值时,我得到的是x为1.200000000000002。。。。。 我知道1.1+0.1不是1.2000000000002,所以我只是想知道我的语法是否有错误。如果您决定运行代码查看,您将立即看到我的问题。 如果有人有任何建议,我将不胜感激 多谢各位 public class EulersMethod { public static void main(String[] args) { doub

好吧,我想这个计划会很简单。但是,当控制台显示system.out.中显示的x值时,我得到的是x为1.200000000000002。。。。。 我知道1.1+0.1不是1.2000000000002,所以我只是想知道我的语法是否有错误。如果您决定运行代码查看,您将立即看到我的问题。 如果有人有任何建议,我将不胜感激

多谢各位

public class EulersMethod {

    public static void main(String[] args) {
        double x = 1;
        double y = 1;
        double h = 0.1;

        while(x <= 1.4){
            System.out.println("When x is " + x + ", y is " + y);

            y = y + h * (- x - y);
            x = x + h;

        }   
    }
}
0.1不能用双精度类型精确表示,因此必须进行某种近似/折衷。对于双精度,它通常只有大约16到17位有效数字。这就是为什么你不能准确地得到1.2的原因。

如果你愿意,你可以使用十进制格式来清理它

DecimalFormat format = new DecimalFormat("0.0");
String decimalValueAsString = format.format(yourDecimalValue);

您还可以使用十进制格式和方法来扩展我的评论,有些数字可以精确地写成双精度,如1/2,而其他数字则不能

0.5 = 1/2
所以可以精确地写成2的幂和

0.1 = 1/10 = 1/16 + a bit = 1/16 + 1/32 + a bit more... etc

多一点永远不可能是二的幂,所以你可以得到它能处理的最接近的值。它可能会过冲,也可能会下冲。

这里有一篇很好的文章,介绍为什么浮动不精确,或者为什么不应该在财务计算中使用浮动:

你真正想要的是大十进制


这里有一个来自JavaWorld的简短教程:

了解浮点运算是如何在计算机中完成的。你可能会感兴趣。大多数精度问题的答案也是BigDecimal类。使用2的幂,如0.5、0.25等,并且不要耗尽位。@doctorlove该注释很酷!:都说出来了!我知道1.1+0.1不是1.2000000000002你知道它错了。[把手扫到脸前]这些不是你要找的小数!非常感谢。似乎很简短