(浮点)m/f 和 (浮点)(m/f) 之间的区别
Difference between (float)m/f and (float)(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/f
的整数值类型转换为浮点数。我不明白的是,在m/f
周围添加括号如何改变答案。
在第二种情况下:
(float)(m/f)
您首先进行整数除法,然后转换为浮点数,因此您丢失了分数。在第一种情况下,您将m
转换为浮点数,因此最终执行浮点除法。
强制转换运算符在 C++ 和 Java 中都具有更高的优先级,但在除法周围使用括号会强制首先对其进行计算。
C++他的行为是由于通常的算术转换,这在C++标准草案第10段5
中有所涉及,该部分说:
许多期望算术或枚举类型的操作数的二元运算符会导致转换和产量 结果类型类似。目的是生成一个通用类型,这也是结果的类型。 这种模式称为通常的算术转换,其定义如下:
并包括以下项目符号:
— 否则,如果其中一个操作数是浮点数,另一个操作数应转换为浮点数。
在 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.
- C++将浮点指针值舍入为小数位数
- 如何防止 c++ 在从浮点型转换为双精度型(不适用于 IO)时添加额外的小数?
- 为什么在浮点中从大到小会引入更多的误差
- 我可以信任表示整数的浮点或双精度来保持精度吗
- 为什么mpfr_printf与十六进制浮点(%a转换说明符)的printf不同
- C++Lua用户数据扰乱了Mathfu浮点值
- 将CHW格式的浮点向量转换为cv::Mat
- 算术运算的结果类似于:C浮点变量中的1/3
- 格式化浮点值:返回默认值
- 浮点定向舍入和优化
- 短是浮点类型吗?
- 从VS 2015更新3更新到VS2015更新3 d后浮点计算行为不同的原因
- 使用 int 表示浮点除法 C++
- 像union_这样的 Boost.Geometry 操作如何处理浮点类型的基本不精确性?
- 直接为浮点变量分配十六进制整数与通过指针转换分配之间的区别
- php和c++中数字格式/浮点之间的区别
- 新(浮点*)[] 和新浮点数*[] 之间的区别
- 当应用于浮点值时,std::abs和std::fabs之间有什么区别吗
- 浮点* 和矢量<float>之间的区别
- (浮点)m/f 和 (浮点)(m/f) 之间的区别