Java 中的数学方程式是如何工作的?

Posted

技术标签:

【中文标题】Java 中的数学方程式是如何工作的?【英文标题】:How do math equations work in Java? 【发布时间】:2012-08-21 11:58:42 【问题描述】:

当我做这样的事情时

int test = 5 + 3 * (4 - 1) / 2;

我得到 9。我怀疑这是因为 int 向下舍入。但是,当我这样做时

float test = 5 + 3 * (4 - 1) / 2;

我也得到 9。但是,当我这样做时

float test1 = 5;
float test2 = 4.5;
float test = test1 + test2;

测试最终输出 9.5。有人可以解释这背后的逻辑吗?为什么我在第二个例子中没有得到 9.5?谢谢。

【问题讨论】:

整数除法在很多语言中都是这样完成的,不仅仅是 Java。所有 C 语言都以这种方式运行:C、C++、C#、Java、javascript 【参考方案1】:

在您的第二个示例中,尽管您将结果分配float 类型的变量,但计算本身仍以与第一个示例完全相同的方式执行。 Java 不会查看目标变量类型来确定如何计算右手边。特别是,子表达式3 * (4 - 1) / 2 的结果是4

要解决此问题,您可以使用浮点文字而不是所有整数:

float test = 5 + 3 * (4 - 1) / 2.0f;

使用2.0f 触发算术表达式的浮点计算。

【讨论】:

这是有道理的,但跟踪起来似乎有点痛苦。谢谢。 @user1626448:大多数时候,您将使用一个或多个现有变量进行计算,这些变量已经具有floatdouble 或其他类型。在这种情况下,您不必担心这一点。【参考方案2】:

虽然您将5 + 3 * (4 - 1) / 2 的结果表示为浮点数,但实际评估是以整数的精度完成的,这意味着9 / 2 的除法返回 4 而不是您将收到的 4.5 如果它们被评估为浮动。

【讨论】:

【参考方案3】:

表达式有自己的类型。所以开始吧:

5 + 3 * (4 - 1) / 2

每个值都有自己的类型。这个类型恰好是int,所以和下面的一样:

((int)5) + ((int)3) * (((int)4) - ((int)1)) / ((int)2)

更清楚地表明我们正在处理整数。只有在评估为 9 之后,它才会被分配给浮点数。

【讨论】:

【参考方案4】:

简短的回答是整数类型在模运算上进行运算,模数为 1,并丢弃余数。

由于您将 test 转换为整数,因此模数运算采用模数 1(例如 9.5 mod 1), int 测试 = 5 + 3 * (4 - 1) / 2;

对于 32 位或 64 位浮点数,这将给出 9.5;但是,因为您将test 转换为int,所以将丢弃剩余部分,test 引用的值是 9。

【讨论】:

以上是关于Java 中的数学方程式是如何工作的?的主要内容,如果未能解决你的问题,请参考以下文章

线性化微分数学解释Einstein狭义相对论质能方程E=MC^2

数学公式中的方程组联立的大括号怎么输入啊?

如何将for循环变成数学方程?

使用 javascript 中的数学方程拆分变量

C++ 数学与算法系列之高斯消元法求解线性方程组

Python小白的数学建模课-10 微分方程边值问题