Java (浮动)地板和(浮动)地板之间的差异

Java (浮动)地板和(浮动)地板之间的差异,java,c++,casting,Java,C++,Casting,谁能告诉我圆括号是如何改变答案的,因为我基本上是在将m/f的整数值键入浮点。我不明白的是,在m/f周围添加括号是如何改变答案的。在第二种情况下: int m = 10; int f = 3; float r = (float)m/f; // gives 3.333333 as output float r = (float)(m/f); // gives 3.0 as output 您先进行整数除法,然后将其转换为浮点,因此会丢失分数。在第一种情况下,您将m强制转换为浮点,因此最终执行

谁能告诉我圆括号是如何改变答案的,因为我基本上是在将
m/f
的整数值键入浮点。我不明白的是,在
m/f
周围添加括号是如何改变答案的。

在第二种情况下:

int m = 10;
int f = 3;
float r = (float)m/f;    // gives 3.333333 as output
float r = (float)(m/f);  // gives 3.0 as output
您先进行整数除法,然后将其转换为浮点,因此会丢失分数。在第一种情况下,您将
m
强制转换为浮点,因此最终执行浮点除法

Cub运算符既有C++又有java,但使用除法括号来对它进行评估,首先是。 在C++中,他的行为是由于C++中标准部分草案<代码> 5 > /COD>表达式第10段所包含的通常的算术转换,其中表示:

许多需要算术或枚举类型操作数的二进制运算符会导致转换并产生 结果类型以类似的方式显示。目的是生成一个公共类型,它也是结果的类型。 此模式称为常用算术转换,其定义如下:

并包括以下项目符号:

-否则,如果任一操作数为浮点,则另一个操作数应转换为浮点

在Java中,此行为包含在以下内容中:

当运算符将二进制数字提升应用于一对操作数(每个操作数必须表示可转换为数字类型的值)时,以下规则依次适用:

包括:

加宽基元转换(§5.1.2)用于转换以下规则指定的一个或两个操作数:

包括:

否则,如果其中一个操作数的类型为float,则另一个操作数将转换为float

并包括以下示例:

(float)(m/f)

不同之处在于转换为float的内容。在第一种情况下,
m
转换为
float
,因此整个表达式成为浮点。在第二个示例中,执行表达式(整数除法),然后转换为浮点,此时保存这些宝贵的有效数字为时已晚。

在第一个示例中,
m
首先被转换为浮点,然后被除法,这将为您提供一个浮点数。第二个例子,除法是一个整数除法,所以它会给你一个整数,然后转换成一个浮点数

添加括号,更改运算符的优先级。类型转换通常在除法之前应用,但使用括号可以告诉编译器在转换为浮点之前进行除法。

(float)m/f
(float)m
除以
f
。因为其中一个操作数是浮点,所以运算符是浮点除法,答案是3.333等


(float)(m/f)
计算
(m/f)
并将其强制转换为float。由于两个操作数都是整数,因此运算是整数除法,
m/f
是3。然后将3强制转换为浮点,变成3.0。

操作顺序:强制转换在除法之前应用,两个整数之间的除法在Java中总是四舍五入(向下)到最接近的整数

int i    = 0;
float f  = 1.0f;

// First int*float is promoted to float*float, then

()
的目的是什么?什么是关联性?括号改变了求值的顺序,这是您真正需要知道的。
float r = (float)m/f;    // Is the same as ((float)m)/f, and because there's a
                         // float in the division, we keep everything a float.
float r = (float)(m/f);  // Is division between two integers, so we round down
                         // to the nearest integer before casting to a float.