java - 整数除法:你如何产生双重?
对于此代码块:
int num = 5;
int denom = 7;
double d = num / denom;
double的值是0.0.它可以通过强制转换来强制工作:
double d = ((double) num) / denom;
但是有另一种方法来获得正确的double结果吗? 我不喜欢铸造原始人,谁知道会发生什么。
10个解决方案
135 votes
double num = 5;
这避免了演员。 但是你会发现演员转换是明确定义的。 您不必猜测,只需检查JLS即可。 int to double是一个扩大的转换。 从§5.1.2开始:
扩展原始转换不会 丢失有关整体的信息 数值的大小。
[...]
转换int或long值 浮动,或长期价值 加倍,可能导致损失 精度 - 也就是说,结果可能会丢失 一些最不重要的部分 价值。 在这种情况下,由此产生 浮点值将是一个 正确的圆形版本 整数值,使用IEEE 754 舍入到最接近的模式(§4.2.4)。
5可以精确表示为double。
Matthew Flaschen answered 2019-03-16T14:28:31Z
87 votes
铸造原语有什么问题?
如果你因某些原因不想演员,你可以这样做
double d = num * 1.0 / denom;
Paul Tomblin answered 2019-03-16T14:29:04Z
62 votes
我不喜欢铸造原始人,谁知道会发生什么。
为什么你对投射原语有一种非理性的恐惧? 如果您将int转换为double,则不会发生任何错误。如果您不确定它是如何工作的,请在Java语言规范中查找。 将int转换为double是一种扩展的原始转换。
您可以通过投射分母而不是分子来摆脱额外的括号:
double d = num / (double) denom;
Jesper answered 2019-03-16T14:29:46Z
24 votes
如果您更改了一个必须记住的变量的类型,如果您的公式发生更改,则再次潜入一个double,因为如果此变量不再是计算的一部分,则结果会搞砸。 我养成了在计算中投射的习惯,并在旁边添加注释。
double d = 5 / (double) 20; //cast to double, to do floating point calculations
请注意,转换结果不会这样做
double d = (double)(5 / 20); //produces 0.0
alianos- answered 2019-03-16T14:30:22Z
12 votes
将其中一个整数/两个整数转换为float以强制使用浮点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
我不认为你正在思考的是铸造有什么问题。
Nikhil Kumar answered 2019-03-16T14:31:05Z
7 votes
类型铸造是唯一的方法
从整数除法生成double d = num / denom * 1.0;-没有强制转换没有其他方法(可能你不会明确地做,但会发生)。
现在,有几种方法我们可以尝试获得精确的double d = num / denom * 1.0;值(其中double d = 0.0 + ( num / denom );和denom是int类型,当然还有铸造) -
使用显式转换:
double d = num / denom * 1.0;
double d = num / denom * 1.0;
double d = num / denom * 1.0;
double d = num / denom * 1.0;
但不是double d = num / denom * 1.0;
隐式转换:
double d = num / denom * 1.0;
double d = num / denom * 1.0;
double d = num / denom * 1.0;
double d = num / denom * 1.0;
但不是double d = num / denom * 1.0;
而不是double d = 0.0 + ( num / denom );
Minhas Kamal answered 2019-03-16T14:38:05Z
2 votes
使用类似的东西:
double step = 1d / 5;
(1d是演员加倍)
ungalcrys answered 2019-03-16T14:38:43Z
0 votes
您可以考虑包装操作。 例如:
class Utils
{
public static double divide(int num, int denom) {
return ((double) num) / denom;
}
}
这使您可以查看(仅一次)演员是否完全符合您的要求。 此方法也可以进行测试,以确保它继续执行您想要的操作。 使用什么技巧来导致除法也没关系(你可以在这里使用任何答案),只要它能得到正确的结果。 你需要划分两个整数的任何地方,你现在可以调用Utils::divide并相信它做的是正确的。
Ken Wayne VanderLinde answered 2019-03-16T14:39:22Z
0 votes
只是用这个。
int fxd=1;
double percent= (double)(fxd*40)/100;
Mabood Ahmad answered 2019-03-16T14:39:50Z
0 votes
最好的方法是
int i = 3;
Double d = i * 1.0;
d is 3.0 now.
Alp Altunel answered 2019-03-16T14:40:18Z