【问题标题】:Why does not java cast int to double in expression automatically?为什么 java 不自动将 int 强制转换为 double 表达式?
【发布时间】:2015-06-03 03:36:45
【问题描述】:
我的问题:
int a = 30, b = 12, c = 2, d = 5, e = 1;
double result = (double) (a - b / (c * d) + e);
System.out.print("Result = " + (double) result + " - " + result);
结果:
Result = 30.0 - 30.0
我想看到的是:29.8!
我有整数,但我想计算一个需要双精度的表达式。
有没有一种简单的方法可以做我尝试过的事情?
【问题讨论】:
标签:
java
casting
int
double
expression
【解决方案1】:
您必须将表达式中的整数之一转换为double。实际上,您不能转换任何整数。要强制转换的重要参数是除法的操作数之一,因为整数除法是您遇到精度损失的原因)。
例如:
double result = (a - (double)b / (c * d) + e);
或
double result = (a - b / (double)(c * d) + e);
这将确保使用浮点运算完成除法。
【解决方案2】:
为什么 java 不自动将 int 转换为 double 表达式?
因为你没有得到小数值的表达式是纯粹根据你给它的操作数来评估的,而不是更大的上下文(这将是非常复杂的)。所以a - b、c * d 和... + e 都使用int 值。只有在获得最终结果后,您才会将其转换为 double,并且编译器不会查看更大的上下文并猜测您想要更早地执行此操作(这是一件好事(tm)支持>)。
如果您希望使用 double 值进行操作,您必须告诉编译器。在这种情况下,您可以将该转换放在多个位置中的任何一个,然后将“冒泡”到使用结果的任何表达式。这是您可以放置它的一个地方:
double result = (a - b / (double)(c * d) + e);
Live example
【解决方案3】:
int 之间的运算结果为int。所以12/10是int的1,如果你想得到double的1.2,你必须将表达式之一转换为double,比如double result = (a - (double)b / (c * d) + e);。