为什么浮点数的使用在 switch 中不起作用?

Mah*_*ni. 4 javascript c switch-statement conditional-statements

如图所示,它抛出错误。请帮助我找到解决方案。

这里我在开关中使用浮点数,应该打印10。
这个错误的原因是什么?为什么?

switch case 示例截图

#include <stdio.h>
void main() {
 float a = 1.0;

 switch (a) {
    case 1:
     printf ("1");
     break;

    case 1.0:
     printf ("10");
     break;
    }
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*ler 6

因为switch取决于精确、简单的数据比较。

浮点数之间的比较可能不会像您期望的那样进行,例如,有一个负零和一个正零。

请参阅:浮点数学是否已损坏?

由于这些原因,作为一个人,当你的意思是“a == b”时,你不能“简单地”说“a == b”。这就是为什么 C 标准根本不允许它作为casea 中的 a switch

事实是:您尝试这样做的事实就是禁止它的充分理由!要么您在不应该使用浮点数的地方(即,存储一组有限的离散值),要么您尚未真正理解浮点数的工作原理,并且在语句中使用它们switch将导致意外的行为。

  • 另一个小问题:你的“3./5”。!= 0.6` 的例子非常好,或者说会很好,只是它是假的!至少在我的计算机上,“3.0f/5.0f”实际上与“0.6f”完全相同(尽管都不等于有理数 3/5)。令人惊讶地失败的简单示例是“0.1f + 0.2f”,它不等于“0.3”,尽管它等于“0.3f”。那么“0.1 + 0.2”不等于“0.3”。好玩。 (4认同)
  • 我的抱怨是,答案似乎是说该语言禁止在浮点值上使用“==”。现在好多了。 (3认同)
  • 但你*可以*说`a == b`! (2认同)
  • @SteveSummit 是的,但浮点数的此类比较的结果通常不会是预期的结果。 (2认同)
  • @MarcusMüller IEEE-754 *十进制*浮点数有歧义,但二进制浮点数没有,除了±0。最小的正常“float”是“0x00800000”或0b1.0 × 2^(-126)或1.17549435e-38。最大的次正规 `float` 稍微小一点:`0x007fffff` 或 0b0.fffffe × 2^(-126) 或 1.17549421e-38。 (2认同)