【问题标题】:php switch case statement to handle ranges with decimals / fractionsphp switch case语句来处理带小数/分数的范围
【发布时间】:2017-03-25 23:33:28
【问题描述】:

使用大小写开关,我将如何测试十进制值是否在范围内?

此代码似乎只检查整数。

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

$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 的延续,但没有解决小数问题。

【问题讨论】:

  • in_array() 确实不是检查浮点数的好方法,因为浮点数不精确;也不是特别适合这种类型的检查使用 switch 语句
  • 我愿意接受有关更好解决方案的建议。

标签: php arrays range decimal fractions


【解决方案1】:

我建议您可以使用另一种方法(如果您没有太多要测试的区间),假设您需要知道哪个区间包含一个数字:

$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;
    }
}

【讨论】:

  • 如果定义的变量实际上是一个全新的句子,我将如何使用此代码? If between 1-20 $my_num_result = "some sentence"if between 21-30 $my_num_result = "some entirely new sentence"
  • 然后你可以使用你的$intervals数组的键来识别那个句子
  • @Damien: 也可以放入数组中:$intervals=[[0,.20,'message'=&gt;'sent1'],[.21,.40,'message'=&gt;'sent2'],...]
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-29
相关资源
最近更新 更多