2017-03-25 66 views
-1

使用case开关,我将如何测试以查看十进制值是否在一个范围内?php switch case语句处理带小数/分数的范围

此代码似乎只检查整个数字。

这是我的代码,试图检查小数/分数。

$my_num = 0.38; 

switch(true) { 
    case in_array($my_num, range(0, .20, 0.01)): 
     $my_num_result = "It looks like your number is between 0 - 0.20!"; 
    break; 
    case in_array($my_num, range(.21, .40, 0.01)): 
     $my_num_result = "I am between .21 - 0.40!"; 
    break; 
} 

//Result: I am between .21 - 0.40! 
echo $my_num_result; 

这个问题是this question and answer的延续,但没有解决小数。

+2

'in_array() “由于浮点不精确,真的不是检查浮点数的好方法;也不使用switch语句特别适合这种类型的检查 –

+0

我很乐意提供更好的解决方案。 – Damien

回答

0

我提出一个不同的方法,您可以使用(如果你没有太多的时间间隔进行测试),可以说你需要知道哪个区间包含一个数字:

$intervals = [[0,.20],[.21,.40],[.41,.60]/*...*/]; 
$num = .32; 

$message = 'I am between %s - %s!'; 

foreach ($intervals as $inter) { 
    if ($inter[0] <= $num && $num <= $inter[1]) { 
     vprintf($message, $inter); 
     break; 
    } 
} 
+0

如果定义的变量实际上是一个全新的句子,我将如何使用此代码? '如果在1-20之间$ my_num_result =“某句话”'如果在21-30 $之间'''my_num_result =“一些全新的句子”' – Damien

+0

然后你可以使用'$ intervals'数组的键来识别句子 –

+0

@ Damien:或者你可以把它放在数组中:'$ intervals = [[0,.20,'message'=>'sent1'],[。21,.40,'message'=>'sent2']。 ..]' –