Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/389.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_Floating Point_Double - Fatal编程技术网

为什么在java中长时间使用不同的结果,而双精度使用相同的值

为什么在java中长时间使用不同的结果,而双精度使用相同的值,java,floating-point,double,Java,Floating Point,Double,我的问题 1) 在第一组中,请说明为什么对相同的值给出不同的值3.45和3.4499998 2) 在第二组输出中,为什么输出不同于第一组输出 提前感谢…在第二组中,您错过了括号,它正在对System.out.println语句“Double sum”和“Float sum”中的字符串执行其他操作,因此请在算术表达式中添加括号以获得正确的结果 public static void main(String[] args) { double firstDouble = 1.8d;

我的问题

1) 在第一组中,请说明为什么对相同的值给出不同的值
3.45
3.4499998
2) 在第二组输出中,为什么输出不同于第一组输出


提前感谢…

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

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
这给

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));
1) 因为float不够精确,无法计算精度高于(3.45-3.4499998)=2E-7的和

2)
“DOUBLE SUM”+firstDouble
将firstDouble转换为字符串并将其串联,然后将其串联到secondDouble。put()时,它首先计算和,并将结果连接到“DOUBLE sum”

System.out.println(“DOUBLE sum”+firstDouble+secondDouble)

此处参数作为
字符串
。加号/加法运算符用作字符串连接。括号具有更高的优先级,以便先求值

第一个问题已经回答了

这非常有用:

对于一个简短的答案,请尝试在处理浮点时使用

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

我知道。所以发生了什么。当我去掉括号时,对我来说,它只给出了这样的串联
双SUM1.81.65浮点SUM1.81.65
@PSR,没有括号,它被解释为
(“双和”+firstDouble)+secondDouble“
,这是两个字符串串联,根本没有浮点加法。要理解@Shubhrajyoti的答案,您应该了解运算符优先级。您可以在此处快速查看:1)1.8d!=1.8f和1.65d!=1.65f如果有相同的,则不需要不同的放置a
f
d
2)括号的优先级会发生变化,因为您评估事物的顺序很重要。如果短小数点特别重要,例如在金融交易中,BigDecimal是一种很好的数据类型。它在其他情况下没有特别的优点,比如科学计算,在科学计算中,10并不特别,而且通常不如双倍计算的效率和方便。
BigDecimal a = new BigDecimal("1.8");
BigDecimal b = new BigDecimal("1.65");
BigDecimal c = a.add(b); // returns a BigDecimal representing exactly 3.45