Java整数 - 双重分裂混淆

8 java

计划1

int sum = 30;  
double avg = sum / 4; // result is 7.0, not 7.5 !!!
Run Code Online (Sandbox Code Playgroud)

VS.

计划2

int sum= 30   
double avg =sum/4.0 // Prints lns 7.5
Run Code Online (Sandbox Code Playgroud)

这是因为程序1中的'4'是一个字面整数吗?所以30/4会给我7.但是由于这个数据类型是double,我们需要添加.0到end.'7.0'

程序2有4.0,它充当文字双.int/double总是会给出double,因为它更精确.所以我们得到'7.5'.我不明白双重数据类型对结果做了什么.它实际上不需要做任何事情,因为双数据类型的条件已经满足.(从计算中得到最准确的结果).

我错了吗?我鼓励你纠正我!这就是我学习的方法.. :)

Cac*_*nta 8

这是一个整数除法(因为它涉及两个整数)

int sum = 30;  
double avg = (sum / 4); // result is 7
Run Code Online (Sandbox Code Playgroud)

整数除法,将向下舍入到最接近的整数.

但是,这是一个双重划分(因为4.0是双倍)

int sum= 30   
double avg = (sum/4.0) //  result is 7.5
Run Code Online (Sandbox Code Playgroud)

这是预期的行为,转换都已明确定义.无需猜测.看一下有关转换的java文档.

将int或long值扩展为float,或将long值转换为double,可能会导致精度损失 - 也就是说,结果可能会丢失该值的一些最低有效位.在这种情况下,使用IEEE 754舍入到最接近模式生成的浮点值将是整数值的正确舍入版本


Ped*_*nso 7

在 java 中,涉及整数类型(int、long 等)的操作具有整数结果。这包括分裂。

30 和 4 都是整数值,因此如果您尝试对它们进行除法,则使用整数除法。

但是,如果您尝试任一30.0/430/4.0那么结果将是7.5因为您将使用浮点除法。

变量的声明类型avg对结果没有影响。小数部分在除法过程中丢失,而不是在将值分配给变量时丢失。


Ben*_* M. 7

在你的第一个例子中:

int sum = 30;
double avg = sum / 4; // result is 7.0, not 7.5 !!!
Run Code Online (Sandbox Code Playgroud)

sum是一个int,4也是一个int.Java将一个整数除以另一个整数并获得整数结果.这一切都发生它分配值之前double avg,到那时你已经丢失了小数点右边的所有信息.

尝试一些铸造.

int sum = 30;
double avg = (double) sum / 4; // result is 7.5
Run Code Online (Sandbox Code Playgroud)

要么

int sum = 30;
double avg = sum / 4.0d; // result is 7.5
Run Code Online (Sandbox Code Playgroud)