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'.我不明白双重数据类型对结果做了什么.它实际上不需要做任何事情,因为双数据类型的条件已经满足.(从计算中得到最准确的结果).
我错了吗?我鼓励你纠正我!这就是我学习的方法.. :)
这是一个整数除法(因为它涉及两个整数)
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舍入到最接近模式生成的浮点值将是整数值的正确舍入版本
在 java 中,仅涉及整数类型(int、long 等)的操作具有整数结果。这包括分裂。
30 和 4 都是整数值,因此如果您尝试对它们进行除法,则使用整数除法。
但是,如果您尝试任一30.0/4或30/4.0那么结果将是7.5因为您将使用浮点除法。
变量的声明类型avg对结果没有影响。小数部分在除法过程中丢失,而不是在将值分配给变量时丢失。
在你的第一个例子中:
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)
| 归档时间: |
|
| 查看次数: |
29514 次 |
| 最近记录: |