C++ 不采用 5/9,似乎对其进行了类型转换
C++ does not take 5/9 and seems to typecast it
为什么
float bla = ( 5/9 )* (100 - 32) result in 0 * 100 -> 0 ?
和
float bla= 5*(100- 32) / 9;
制定出?他似乎将 5/9 视为整数并立即将其变为 0,但结果变量是浮点数,因此编译器应该知道他可以使用 5/9 或?
使用正确的文字,以便获得正确的数学行为
float bla = 5.0f * (100.0f - 32.0f) / 9.0f;
请注意以下简要列表
5 // int
5l // long
5.0 // double
5.0f // float
5ul // unsigned long
整数文本和浮点文本的更全面列表
在您的示例中,整个右侧在int
操作中执行,然后将最终结果隐式转换为 float
。到那时为时已晚。
请记住,使用正确的文字很重要!
他似乎将 5/9 视为整数,并立即将其变为 0
没错;整数除法的结果是一个整数。
不但是结果变量是一个浮点数,所以编译器应该知道他可以使用 5/9 OR?
,表达式的类型从不取决于之后如何处理它。如果需要转换为另一种类型,则在计算表达式后发生。
使用:
float bla = ( (float)5/9 )* (100 - 32)
因为当你做5/9
时,你做一个整数除法,结果是0。如果需要浮点分割,请在除法的元素中进行强制转换。
float
类型位于等式的另一侧 - 因此在计算右侧的表达式之前不会转换为float
。由于所有这些变量都是整数,因此算术不会是浮点数。至少将一个转换为float
,它应该按预期运行。
为了防止常量被视为整数,请记下以下计算:
float bla = ( 5./9. )* (100. - 32.);
这里的关键是整数除法。 5/9
等于大约0.55555...
,但在整数除法中,小数被截断。所以真的,它只是0
.因此,我们有
0 * (100-32) -> 0
5*(100-32)/9
似乎因为100-32=68
而计算,68*5=340
和340/9 = 37.777...
四舍五入到37。所以在现实中,你仍然得到一个"不正确"的答案,但它不是零的,所以它看起来一目了然是有效的。
你的问题是你正在做整数算术,其中5/9 == 0
在您的第一个示例中
float bla = 5/9 * (100-32)
= 0 * (100-32)
= 0
然而,第二个:
float bla= 5*(100- 32) / 9;
= 5*68 / 9
= 340 / 9
= 37
由于整数除法,两者都不正确。第二个应该是 37.77777
要修复它,请将值更改为浮点数:
float bla= 5.0f/9.0f * (100-32)
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- C++中的双指针类型转换
- 逐位操作的隐式类型转换
- 模板中的类型转换
- 在 C++(和 C)中进行类型转换时明显不一致
- 字符类型转换不兼容
- 将复杂的非基元C++数据类型转换为 Erlang/Elixir 格式,以使用 NIF 导出方法
- C++:用户定义的显式类型转换函数错误
- 将类指针类型转换为键时出错
- 通过引用传递参数时C++类型转换
- 在 C++ 中将一个模板类型的对象类型转换为另一个模板类型
- C++显式类型转换(C 样式强制转换)的强制表示法和static_cast的多种解释
- C++无效的函数类型转换
- 在将派生类指针类型转换为派生类指针后,从基类指针调用派生类函数
- 如何将Windows产品类型转换为名称?
- 通过构造函数方法输出的类到类类型转换是 5500 为什么不是 5555
- 事件系统:使用类型转换或联合进行继承
- 如何在参数中定义隐式类型转换的构造函数?
- 类模板实例化中的类型转换