-1

好的,我想这个程序会很简单。但是,当控制台显示 x 值(显示在 system.out. 中)时,我得到“当 x 为 1.20000000000002 ....”。我知道 1.1 + 0.1 不是 1.200000000002,所以我只是想知道我的语法是否有问题。如果您决定运行代码来查看,您将立即看到我的问题。如果有人有任何建议,我将不胜感激!

谢谢你

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;

        }   
    }
}
4

4 回答 4

3

0.1不能用double类型精确表示,因此必须做出一些近似/妥协。而对于 adouble它通常只有大约 16 到 17 位有效数字。这就是为什么你不能得到1.2确切的。

于 2013-10-04T17:24:39.393 回答
1

这是一篇很好的文章,关于为什么浮点数不准确(或者为什么它们永远不应该用于财务计算):http ://effbot.org/pyfaq/why-are-floating-point-calculations-so-inaccurate.htm

你真正想要的是 BigDecimal。

这是来自 JavaWorld 的简短教程:http ://www.javaworld.com/javaworld/jw-06-2001/jw-0601-cents.html

于 2013-10-04T17:29:29.173 回答
1

为了扩展我的评论,有些数字可以精确地写成双精度数,例如 1/2,而其他数字则不能。

0.5 = 1/2

所以可以写成两个的幂的和

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

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

于 2013-10-04T17:29:10.237 回答
0

如果您愿意,可以使用DecimalFormat来清理它。

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

文档

您还可以将小数格式与RoundingMode和方法setRoundingMode一起使用

于 2013-10-04T17:27:52.357 回答