为什么这里不同的结果是java for long和double具有相同的值

时间:2013-05-17 04:21:13

标签: java floating-point double

public static void main(String[] args) {
        double firstDouble = 1.8d;
        double secondDouble = 1.65d;


        float firstFloat = 1.8f;
        float secondFloat = 1.65f;
        System.out.println("DOUBLE SUM : "+(firstDouble + secondDouble));
        System.out.println("FLOAT SUM :"+(firstFloat + secondFloat));

        System.out.println("DOUBLE SUM"+firstDouble + secondDouble);
        System.out.println("FLOAT SUM"+firstFloat + secondFloat);
    }

OUT PUT:

DOUBLE SUM : 3.45
FLOAT SUM :3.4499998

DOUBLE SUM :1.81.65
FLOAT SUM :1.81.65

我的问题

1)在第一组输出中,为什么它为相同的值提供不同的值3.453.4499998   2)在第二组中,为什么输出与第一轮输出不同。

提前致谢...

4 个答案:

答案 0 :(得分:1)

System.out.println("DOUBLE SUM"+firstDouble + secondDouble);

此处参数采用String。和plus / addition运算符作为String concatition工作。支架具有更多的优点,因此首先进行评估。

第一个问题已经回答了。 Please find here

答案 1 :(得分:0)

在第二组中你错过了括号,它在System.out.println语句“Double sum”和“Float sum”中使用String执行其他操作,因此在算术表达式中添加括号以获得正确的结果

System.out.println("DOUBLE SUM : "+(firstDouble + secondDouble));
System.out.println("FLOAT SUM :"+(firstFloat + secondFloat));

System.out.println("DOUBLE SUM"+ (firstDouble + secondDouble));
System.out.println("FLOAT SUM"+(firstFloat + secondFloat));

这给出了

DOUBLE SUM 3.45
FLOAT SUM 3.4499998
DOUBLE SUM 3.45
FLOAT SUM 3.4499998

答案 2 :(得分:0)

1)因为浮点数不够精确,无法精确计算和(3.45-3.4499998)= 2E-7 http://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.2.3

2)"DOUBLE SUM"+firstDouble将firstDouble转换为String并连接它们,然后连接secondDouble。当你把()它首先计算总和,并将结果连接到“双和”

答案 3 :(得分:0)

这非常有用:http://floating-point-gui.de/languages/java/

对于简短的回答,在处理浮点时尝试使用BigDecimal

BigDecimal a = new BigDecimal("1.8");
BigDecimal b = new BigDecimal("1.65");
BigDecimal c = a.add(b); // returns a BigDecimal representing exactly 3.45