C++ 不采用 5/9,似乎对其进行了类型转换

C++ does not take 5/9 and seems to typecast it

本文关键字:类型转换 C++      更新时间:2023-10-16

为什么

 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=340340/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)