java 整数除法整数_java - 整数除法:你如何产生双重?

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值