整数除法:你如何产生一个双精度?
对于这个代码块:
int num = 5; int denom = 7; double d = num / denom;
d
的值是0.0
。 它可以通过强制转换工作:
double d = ((double) num) / denom;
但是还有另一种方法来获得正确的double
结果吗? 我不喜欢投下原始人,谁知道会发生什么。
double num = 5;
这避免了演员。 但是你会发现投射转换是明确的。 你不必猜测,只需检查JLS 。 int double是一个扩大的转换。 从§5.1.2 :
拓宽原始转换不会丢失有关数值整体大小的信息。
[…]
将int或long值转换为float值,或将long值转换为double值可能会导致精度损失 – 也就是说,结果可能会丢失值的某些最低有效位。 在这种情况下,使用IEEE 754 round-to-nearest模式(§4.2.4) ,得到的浮点值将是整数值的正确舍入版本。
5可以完全expression为一个双。
铸造基元有什么问题?
如果你不想因为某种原因而投,你可以这样做
double d = num * 1.0 / denom;
我不喜欢投下原始人,谁知道会发生什么。
你为什么对铸造原始物有一种非理性的恐惧? 当你将一个int
转换为double
时,没有什么不好的事情发生。 如果您不确定它是如何工作的,请查看Java语言规范 。 将int
转换为double
是一个扩大的原始转换 。
您可以通过投下分母而不是分子来摆脱额外的一对括号:
double d = num / (double) denom;
如果你改变一个variables的types,你必须记住如果你的公式改变,再次潜入一个double,因为如果这个variables停止作为计算的一部分,结果就搞砸了。 我习惯在计算中投射,并在旁边添加注释。
double d = 5 / (double) 20; //cast to double, to do floating point calculations
请注意,铸造结果不会这样做
double d = (double)(5 / 20); //produces 0.0
将其中一个整数/两个整数都浮起来以强制该操作用浮点数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
没有其他方法没有铸造 (可能是你不会明确做,但会发生)。
现在,有几种方法可以获得精确的double
值(其中num
和denom
是int
types,当然还有cast ) –
-
与明确的铸造:
-
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 );
使用类似于:
double step = 1d / 5;
(1d是要加倍的)
你可能会考虑包装的操作。 例如:
class Utils { public static double divide(int num, int denom) { return ((double) num) / denom; } }
这可以让你查看(只是一次)演员是否做到了你想要的。 这种方法也可以进行testing,以确保它继续做你想做的事情。 你也可以使用什么技巧来引起分割(你可以使用这里的任何答案),只要它能产生正确的结果。 无论你需要分割两个整数,你现在可以调用Utils::divide
并相信它做的是正确的事情。
就用这个吧
int fxd=1; double percent= (double)(fxd*40)/100;
最好的方法是
int i = 3; Double d = i * 1.0; d is 3.0 now.