双精度 进度条 java_关于java:Integer除法器:如何产生双精度?

对于此代码块:

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并相信它做对了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值