对于此代码块:
int num = 5;
int denom = 7;
double d = num / denom;
的值d
就是0.0
。它可以通过强制转换来工作:
double d = ((double) num) / denom;
但是还有另一种方法来获得正确的double
结果吗?我不喜欢强制转换基元,谁知道会发生什么。
对于此代码块:
int num = 5;
int denom = 7;
double d = num / denom;
的值d
就是0.0
。它可以通过强制转换来工作:
double d = ((double) num) / denom;
但是还有另一种方法来获得正确的double
结果吗?我不喜欢强制转换基元,谁知道会发生什么。
Answers:
double num = 5;
这样可以避免强制转换。但是您会发现强制转换的定义很明确。您不必猜测,只需检查JLS即可。从int到double是一个不断扩大的转换。从第5.1.2节开始:
扩展原始转换不会丢失有关数值总体大小的信息。
[...]
将int或long值转换为float或将long值转换为double可能会导致精度损失,也就是说,结果可能会丢失该值的某些最低有效位。在这种情况下,使用IEEE 754舍入到最近模式(第4.2.4节),结果浮点值将是整数值的正确舍入版本。
5可以精确表示为双精度。
1.0
仍然会改变结果的类型,只是以不同的方式。“对我来说似乎是肮脏的代码”并不能解释您认为乘以哪种情况1.0
实际上更好(或者为什么这样)。
(double)num
有所变化num
。它不是-它为语句的上下文创建一个临时的double。
强制转换基元有什么问题?
如果您出于某些原因不想进行投射,可以这样做
double d = num * 1.0 / denom;
double d = num * 1D / denom;
我不喜欢强制转换基元,谁知道会发生什么。
为什么对转换基元有非理性的恐惧?当你施放一个会发生什么不好int
的double
。如果您不确定它的工作方式,请在Java语言规范中进行查找。转换为int
to double
是一个不断扩大的原始转换。
您可以通过使用分母而不是分子来消除多余的一对括号:
double d = num / (double) denom;
double d = (double) num / denom;
...(确定,这取决于优先级)
将整数之一或整数两者都强制转换为浮点数,以强制执行浮点运算Math的操作。否则,始终首选整数Math。所以:
1. double d = (double)5 / 20;
2. double v = (double)5 / (double) 20;
3. double v = 5 / (double) 20;
请注意,强制转换结果不会这样做。因为首先除法是根据优先级规则完成的。
double d = (double)(5 / 20); //produces 0.0
我认为您正在考虑的转换没有任何问题。
double
从整数除法产生a- 没有其他方法可以不进行强制转换(也许您不会明确地执行它,但它会发生)。
现在,有几种方法可以尝试获取精确的double
值(where num
和denom
are int
类型,以及使用铸造的过程)-
使用显式强制转换:
double d = (double) num / denom;
double d = ((double) num) / denom;
double d = num / (double) denom;
double d = (double) num / (double) denom;
但不是 double d = (double) (num / denom);
使用隐式强制转换:
double d = num * 1.0 / denom;
double d = num / 1d / denom;
double d = ( num + 0.0 ) / denom;
double d = num; d /= denom;
但不是double d = num / denom * 1.0;
,不是double d = 0.0 + ( num / denom );
您可以考虑包装操作。例如:
class Utils
{
public static double divide(int num, int denom) {
return ((double) num) / denom;
}
}
这使您可以(一次)查找演员表是否完全符合您的要求。此方法也可能要经过测试,以确保它可以继续执行您想要的操作。只要能产生正确的结果,使用何种技巧进行除法也无关紧要(您可以在此处使用任何答案)。现在,您需要将两个整数相除的任何地方,都可以调用Utils::divide
并信任它可以做正确的事情。
只是使用这个。
int fxd=1;
double percent= (double)(fxd*40)/100;