1. 概述

在Java中,我们可以使用除法运算符(/) 来将左边的值除以右边的值。例如,int number = 10 / 5

在这篇简短教程中,我们将探讨如何从整数除法运算中获取浮点数结果。

2. 问题介绍

首先,为了简化,我们将在本教程中使用单元测试断言来验证计算结果。

我们可能已经注意到,当我们像 a/b 这样对两个整数进行除法运算时,即使 a 不能被 b 整除,它总是返回一个整数,比如:

int i = 10 / 4;
assertEquals(2, i);

运行测试后,它会通过。所以,10 / 4 的结果是 2,而不是 2.5。此外,即使我们将计算结果赋给一个 float 变量,结果仍然是 2:

float x = 10 / 4;
assertEquals(2, x);

接下来,让我们先理解为什么会这样,然后找出如何获得期望的浮点数结果,例如在这个例子中得到 2.5。

3. 为什么Java中两个整数相除总是得到整数?

要了解为什么 10 / 4 = 2,我们需要查阅JLS(Java语言规范)中关于除法运算符的部分,了解其行为是如何定义的。

首先,规范规定整数除法向零舍入。也就是说,两个整数除法的结果只包含商的值,余数不包括在内。

因此,当我们计算 10 / 4 时,我们得到的是 2,而不是 2.5。

现在,让我们看看如果两个整数不能被整除,如何得到预期的浮点数结果。

4. 如何使两个整数相除得到浮点数?

现在我们理解了两个整数之间的除法操作。JLS还定义了基本运算符转换规则,特别是在 二元数值提升 中。

二元数值提升发生在 *, /, % 运算符上。因此,除法运算遵循运算符转换规则。

接下来,让我们仔细看看这个转换规则。

根据JLS,当我们计算 a/b 时:

  • 如果任意一个操作数是 double 类型,另一个会被转换为 double
  • 否则,如果任意一个操作数是 float 类型,另一个会被转换为 float
  • 否则,如果任意一个操作数是 long 类型,另一个会被转换为 long
  • 否则,两个操作数都会转换为 int 类型。

根据上述规则,如果我们想让 a/b 的运算结果为浮点数,至少需要有一个操作数是 float 类型。

那么,接下来让我们看看将一个操作数转换为 float 是否能得到预期结果:

float x = (float) 10 / 4;
assertEquals(2.5, x);

float y = 10 / (float) 8;
assertEquals(1.25, y);

如果运行这个测试,它会通过。因此,将任何操作数转换为 float 会使除法运算产生 float 结果

5. 总结

在这篇简短的文章中,我们讨论了为什么在Java中两个整数相除总是得到整数。

此外,我们解决了如何从整数除法中获得预期的 float 结果的问题,这对于非整除情况尤其有用。

如往常一样,文章中展示的所有代码片段可在 GitHub 上查看