如图所示,它抛出错误。请帮我找到解决方案。
这里我在开关中使用浮点数,应该打印10。这个错误的原因是什么?
代码:
#include <stdio.h>
void main() {
float a = 1.0;
switch (a) {
case 1:
printf ("1");
break;
case 1.0:
printf ("10");
break;
}
}
因为
switch
取决于精确,纯数据比较。
浮点数之间的比较可能不会像您期望的那样工作,例如,有一个负零和一个正零。
参见:浮点数学是否被破坏?
出于这些原因,作为一个人,当你的意思是“a == b”时,你不能“简单地”说“a == b”。这就是为什么 C 标准根本不允许它作为
case
中的 switch
。
事实是:你试图这样做的事实就是禁止它的一个很好的理由!要么您在不应该使用的地方使用了浮点数(即,存储一组有限的离散值),要么您还没有真正理解浮点数的工作原理,并且在
switch
语句中使用它们将导致意外的行为。
至于您问题中的“请帮助我”部分,您可能可以或多或少地实现如下......
而不是
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;
}
为什么我们不能在 switch 条件语句中使用浮点数?
因为语言定义是这么说的。
因为比较浮点数是否完全相等(switch 语句隐式执行此操作)通常是一个坏主意。
因为使用浮点变量作为控制变量通常是一个坏主意。 @史蒂夫峰会
没有迫切需要此功能。