Java 整数除法:如何生成一个双精度数?
对于此代码块:Java 整数除法:如何生成一个双精度数?,java,casting,integer-division,Java,Casting,Integer Division,对于此代码块: int num = 5; int denom = 7; double d = num / denom; d的值为0.0。可以通过铸造强制工作: double d = ((double) num) / denom; 但是有没有其他方法可以获得正确的double结果?我不喜欢铸造原始人,谁知道会发生什么 double num = 5; 这样可以避免演员阵容。但是您会发现强制转换是定义良好的。你不必猜,只要查一下表就行了。int到double是一种加宽转换。发件人: 加宽基元转换
int num = 5;
int denom = 7;
double d = num / denom;
d
的值为0.0
。可以通过铸造强制工作:
double d = ((double) num) / denom;
但是有没有其他方法可以获得正确的double
结果?我不喜欢铸造原始人,谁知道会发生什么
double num = 5;
这样可以避免演员阵容。但是您会发现强制转换是定义良好的。你不必猜,只要查一下表就行了。int到double是一种加宽转换。发件人:
加宽基元转换不需要
丢失有关整个系统的信息
数值的大小
[……]
整型或长型值的转换
浮动,或长值浮动
加倍,可能导致损失
精确性也就是说,结果可能会丢失
数据的一些最低有效位
价值。在这种情况下,结果是
浮点值将是一个
正确四舍五入版本的
整数值,使用IEEE 754
四舍五入到最近的模式
5可以精确地表示为双精度。铸造原语有什么问题 如果你出于某种原因不想出演,你可以这样做
double d = num * 1.0 / denom;
我不喜欢铸造原始人,谁知道会发生什么
double num = 5;
为什么你对铸造原始人有一种非理性的恐惧?当您将int
转换为double
时,不会发生什么坏事。如果你只是不确定它是如何工作的,可以在。将int
转换为double
是一个错误
您可以通过铸造分母而不是分子来消除额外的一对括号:
double d = num / (double) denom;
如果你改变了其中一个变量的类型,你必须记住,如果你的公式改变了,你必须再次潜入一个double,因为如果这个变量不再是计算的一部分,那么结果就会一团糟。我习惯于在计算中进行转换,并在其旁边添加注释
double d = 5 / (double) 20; //cast to double, to do floating point calculations
请注意,强制转换结果并不能做到这一点
double d = (double)(5 / 20); //produces 0.0
将其中一个整数/两个整数强制转换为浮点,以强制使用浮点数学完成运算。否则,始终首选整数数学。因此:
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 step = 1d / 5;
(1d是双精度转换)是唯一的方法
也许你不会明确地这样做,但它会发生
现在,有几种方法可以尝试获得精确的double
值(其中num
和denom
是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)代码>
现在如果你在问-哪一个更好?明确的还是含蓄
好吧,我们不要直接回答。请记住——我们程序员不喜欢源代码中的惊喜或魔术。我们真的很讨厌复活节彩蛋
另外,额外的操作肯定不会使代码更高效。对吗? < P>你可以考虑包装手术。例如:
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;
最好的方法是
int i = 3;
Double d = i * 1.0;
d is 3.0 now.
只要加上“D”
+1.不要害怕铸造。了解它是如何工作的。这一切都定义得很好。@Fabriciph这在任何情况下都有效,与*1.0解决方案相同。@Saposhiente它超出了工作与否的范围。对我来说,更改变量的类型似乎是肮脏的代码。如果你有一个必须是整数的东西,并且为了能够执行数学运算而改变了浮点数的表示形式,那么你可能在冒险。此外,在某些上下文中,将变量读取为整数会使代码更容易理解。@FabricioPH乘以1.0
仍然会以不同的方式更改结果的类型。”“对我来说,似乎肮脏的代码”并没有解释在什么情况下你认为乘以1.0
实际上更好(或者为什么会更好)。@FabricioPH你和OP似乎在错误的信念下工作(你说“改变变量的类型”),即做(double)num
会改变num
。它不会-它会为语句的上下文创建一个临时双精度。将“int”强制转换为双精度的可能重复是安全的,我想知道编译器对除法是否采取了以下正确步骤:1)将num转换为float 2)将denom转换为float 2)将num除以denom。如果我不正确,请告诉我。你也可以做double d=(double)num/denom代码>。。。(好的,这取决于优先级)…它在乘法之前进行隐式强制转换在大多数情况下,这比更改其他变量的类型要好。@FabricioPH没有任何东西表明这是真的,除非你有一个可引用的源。@Saposhiente在你的其他类似的co中回答