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

问题描述 投票:0回答:3

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

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

代码:

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

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

    case 1.0:
     printf ("10");
     break;
    }
}
javascript c conditional-statements switch-statement
3个回答
6
投票

因为

switch
取决于精确,纯数据比较。

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

参见:浮点数学是否被破坏?

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

case
中的
switch

事实是:你试图这样做的事实就是禁止它的一个很好的理由!要么您在不应该使用的地方使用了浮点数(即,存储一组有限的离散值),要么您还没有真正理解浮点数的工作原理,并且在

switch
语句中使用它们将导致意外的行为。


1
投票

至于您问题中的“请帮助我”部分,您可能可以或多或少地实现如下......

而不是

double x=1.,y=2.;
blah; blah; blah;
switch(x){
  default: break;
  case y: blah; break;
  }

尝试类似的事情

double x=1., y=2., xmax=10000., xmin=1.;
int   ix=1, iy=2,  imax=100;
blah; blah; blah;
ix = ((x-xmin)/(xmax-xmin))*((double)imax);
iy = ((y-xmin)/(xmax-xmin))*((double)imax);
switch(ix){
  default: break;
  case iy: blah; break;
  }

0
投票

为什么我们不能在 switch 条件语句中使用浮点数?

  1. 因为语言定义是这么说的。

  2. 因为比较浮点数是否完全相等(switch 语句隐式执行此操作)通常是一个坏主意。

  3. 因为使用浮点变量作为控制变量通常是一个坏主意。 @史蒂夫峰会

  4. 没有迫切需要此功能。

© www.soinside.com 2019 - 2024. All rights reserved.