Java 解释;累积舍入误差“;对于双值

Java 解释;累积舍入误差“;对于双值,java,int,double,Java,Int,Double,我是一个自学成才的java初学者,在同一个等式中使用整数和双数时,我很难理解 比如说, int x; double x; i = 5; x = i / 2 + 1.0; // (answer 3.0) z = (int) 1.0 + i / 2.0; // (answer 3.5) 舍入是怎么回事 问题在于此操作: i / 2 。。。正在执行整数除法。这就是为什么5/2给出的结果是2,而不是2.5。这是Java中的正常行为,要执行浮点除法,必须确保至少有一个操作数是浮点文字: 5 / 2

我是一个自学成才的java初学者,在同一个等式中使用整数和双数时,我很难理解

比如说,

int x;
double x;
i = 5;

x = i / 2 + 1.0; // (answer 3.0)

z = (int) 1.0 + i / 2.0; // (answer 3.5)

舍入是怎么回事

问题在于此操作:

i / 2
。。。正在执行整数除法。这就是为什么
5/2
给出的结果是
2
,而不是
2.5
。这是Java中的正常行为,要执行浮点除法,必须确保至少有一个操作数是浮点文字:

5 / 2.0
现在,如上所示,将返回
2.5
。或者,可以强制转换其中一个操作数:

((double) i) / 2

包含两个整数的除法将产生一个整数(因此,5/2=2)。如果在其中一个操作数中使用一个double,它将产生一个double(因此5/2.0=2.5)。其余的是操作优先级。

i/2=int 2
,因为两个操作数都是整数,所以使用整数除法运算(产生整数结果)


i/2.0=double 2.5
因为我首先被强制为double(其他操作数的类型),并且使用了双除法

这是整数和十进制除法之间的情况

当两个整数被除时,执行整数除,即数字被除,小数部分被截断

当所讨论的两个数字中的任何一个是十进制(双精度/浮点型)时,其他每一个数字都会被视为十进制,因此给定表达式5/2.0。结果将以2.0对象的任何类型返回2.5(默认为双精度)

给定一个混合方程,如5/2+1.0,运算符优先级定义表达式的求值方式。由于除法的优先级高于加法,所以5/2作为整数除法计算,返回2作为整数


然后将其添加到1.0,其中2在求值之前升级为双精度,并将数字3.0作为双精度返回作为最终结果

除了答案之外,
z=(int)1.0+i/2.0
并没有按照您的想法做。它相当于
z=((int)1.0)+i/2.0
,其中
1.0
转换为
1
,然后升级为
1.0