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:大多数时候,您将使用一个或多个现有变量进行计算,这些变量已经具有float
或double
或其他类型。在这种情况下,您不必担心这一点。【参考方案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 中的数学方程式是如何工作的?的主要内容,如果未能解决你的问题,请参考以下文章