(浮点)m/f 和 (浮点)(m/f) 之间的区别

Difference between (float)m/f and (float)(m/f)

本文关键字:浮点 区别 之间      更新时间:2023-10-16
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/f的整数值类型转换为浮点数。我不明白的是,在m/f周围添加括号如何改变答案。

在第二种情况下:

(float)(m/f)

首先进行整数除法,然后转换为浮点数,因此您丢失了分数。在第一种情况下,您将m转换为浮点数,因此最终执行浮点除法。

强制转换运算符在 C++ 和 Java 中都具有更高的优先级,但在除法周围使用括号会强制首先对其进行计算。

C++他的行为是由于通常的算术转换,这在C++标准草案第105中有所涉及,该部分说:

许多期望算术或枚举类型的操作数的二元运算符会导致转换和产量 结果类型类似。目的是生成一个通用类型,这也是结果的类型。 这种模式称为通常的算术转换,其定义如下:

并包括以下项目符号:

— 否则,如果其中一个操作数是浮点数

,另一个操作数应转换为浮点数。

Java 中,JLS 第 5.6.2 节中介绍了此行为。二进制数字促销说:

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

包括:

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

包括:

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

并包括以下示例:

int i    = 0;
float f  = 1.0f;
// First int*float is promoted to float*float, then

区别在于转换为浮点数的内容。在第一种情况下,m被转换为float,所以整个表达式变成浮点数。在第二个中,您执行表达式(整数除法(,然后转换为 float ,此时保存这些宝贵的有效数字为时已晚。

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

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

在第一个例子中,m被强制转换为先浮点数然后除法,这给了你一个浮点数。第二个示例,除法是一个 int 除法,因此它会给你一个 int 数字,然后转换为浮点数。

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

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

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.