对于此代码块:
int num = 5;
int denom = 7;
double d = num / denom;
d的值是0.0。 它可以通过强制转换来工作:
double d = ((double) num) / denom;
但是还有另一种方法来获得正确的double结果吗? 我不喜欢强制转换基元,谁知道会发生什么。
Java的可能重复-Java中的简单划分--->错误/功能?!
将int转换为double是安全的,您将始终获得相同的值而不会损失精度。
我想知道以下是编译器为除法所采取的正确步骤:1)将num转换为浮点数2)将denom转换为浮点数2)将num除以denom。 如果我不正确,请告诉我。
double num = 5;
这样可以避免强制转换。但是您会发现强制转换的定义很明确。您不必猜测,只需检查JLS。从int到double是一个不断扩大的转换。从§5.1.2开始:
Widening primitive conversions do not
lose information about the overall
magnitude of a numeric value.
[...]
Conversion of an int or a long value
to float, or of a long value to
double, may result in loss of
precision-that is, the result may lose
some of the least significant bits of
the value. In this case, the resulting
floating-point value will be a
correctly rounded version of the
integer value, using IEEE 754
round-to-nearest mode (§4.2.4).
5可以精确表示为双精度。
+1。别再害怕铸造了。了解其工作原理。一切都明确。
如果出于某种原因您应该将num保留为整数,则此方法可能无效。我认为* 1.0解决方案更加灵活。
@FabricioPH这适用于所有情况,并且与* 1.0解决方案相同。
@Saposhiente它超出了工作范围。对我来说,更改变量的类型似乎是肮脏的代码。如果您必须使用整数,并且为了能够执行数学运算而更改浮点数的表示形式,则可能会冒险冒险。同样,在某些情况下,将变量读取为整数会使代码更易于理解。
@FabricioPH乘以1.0仍然会以不同的方式更改结果的类型。在我看来,肮脏的代码无法解释您认为在哪种情况下乘以1.0实际上更好(或为什么这样)。
@Matthew Flaschen实际上我做到了。请再次阅读我的最后评论。
@FabricioPH您和OP似乎在错误的信念(您说"更改变量的类型")下工作,他们认为(double)num会以某种方式更改num。它没有-它为语句的上下文创建一个临时的double。
@PaulTomblin如答案中所述,当您说double num = 5;时,表示变量的类型为double,而不是int。这就是FabricioPH所抱怨的,而不是任何演员表。
强制转换基元有什么问题?
如果您出于某些原因不想进行投射,可以这样做
double d = num * 1.0 / denom;
...在乘法之前进行隐式转换
在大多数情况下,这比更改其他变量的类型更好。
@FabricioPH没有什么可以证明这是真的,除非您有引用的来源。
@Saposhiente在您的其他类似评论中回答
您还可以使用" D"后缀(执行相同的隐式强制转换); -例如:double d = num * 1D denom;
I don't like casting primitives, who knows what may happen.
您为什么对转换基元有非理性的恐惧?将int强制转换为double时,不会发生任何不良情况。如果您不确定它是如何工作的,请在Java语言规范中进行查找。将int强制转换为double是扩大的原始转换。
您可以通过使用分母而不是分子来消除多余的一对括号:
double d = num / (double) denom;
您也可以执行double d = (double) num denom; ...(好吧,这取决于优先级)
如果您更改一个变量的类型,则您必须记住,如果您的公式发生更改,则必须再次潜入两倍,因为如果该变量不再是计算的一部分,则结果将被弄乱。我习惯在计算中进行强制转换,并在其旁边添加注释。
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类型,并且当然具有强制转换)-
使用显式强制转换:
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是一倍的转换)
1d不是强制转换,只是声明。
最好的方法是
int i = 3;
Double d = i * 1.0;
d is 3.0 now.
只是使用这个。
int fxd=1;
double percent= (double)(fxd*40)/100;
您可以考虑包装操作。例如:
class Utils
{
public static double divide(int num, int denom) {
return ((double) num) / denom;
}
}
这使您可以(一次)查找演员表是否完全符合您的要求。此方法也可能要经过测试,以确保它可以继续执行您想要的操作。只要能产生正确的结果,使用何种技巧进行除法也无关紧要(您可以在此处使用任何答案)。现在,您需要将两个整数相除的任何地方,都可以调用Utils::divide并相信它做对了。
double除以int java java中int除以double
转载文章标签 double除以int java 双精度 进度条 java 强制转换 ci 浮点数 文章分类 Java 后端开发
-
java 线程安全的int
java 线程安全的int
线程安全 原子变量 Java -
double类型除以int类型java double 除以int
名人名言昨日翻译“Twenty years from now you will be more disappointed by the things that you didn’t do than by the ones you did do.” &
double类型除以int类型java double除以int结果是int吗 java double转float java double转int java double除以int -
opencore引导安装镜像
自从苹果采用intel处理器以来,黑苹果成为不少DIY玩家的选择,在现在科技快速发展的时代,在黑苹果引导方面也有很大的进步。目前open core引导的普及,使安装黑苹果很简单,甚至和安装Windows不无差异。目前的open core引导代替clover引导就像几年前clover引导代替变色龙引导一样,由于open core引导更好的兼容性,成为未来安装黑苹果主流引导指日可待,接下来我将会从op
opencore引导安装镜像 OC 获取view相对位置 oc引导开机直接进 oc怎么添加win引导 怎么复制黑苹果config配置