使用开关和范围确定一个值

Determine a value with switch and range

我编写了以下代码来根据电影的 IMDb 评级对某些电影进行自定义评级(我正在使用 class 在 github).

无论如何,这对我数据库中的 643 部电影来说效果很好,但是对于 12 部特定电影,它无法识别 IMDb 评级对应的正确范围...这并不是说这 12 部电影有任何特殊数字而不是评级...我写下了那 12 部电影的价值,它们是正常的浮点数(好吧,除了一部非常古老的外国电影而且它 returns n/A - 但即使是 floatval()'ed 变为 0)...出于统计原因,无法识别的值以及它们出现的时间是这些:

1x time 0 [it's the unrated one]
2x times a rating of 3.4
2x times a rating of 3.8
4x times a rating of 3.9
1x time a rating of 4.1
2x times a rating of 4.6

执行此自定义评级的代码是这样的(非常简单直接):

$rating = floatval($imdb->getRating());

switch (true) {
    case in_array($rating, range(1, 4.9, 0.1)):
        $return['movie_rating'] = 1;
        break;
    case in_array($rating, range(5, 5.9, 0.1)):
        $return['movie_rating'] = 2;
        break;
    case in_array($rating, range(6, 6.9, 0.1)):
        $return['movie_rating'] = 3;
        break;
    case in_array($rating, range(7, 7.9, 0.1)):
        $return['movie_rating'] = 4;
        break;
    case in_array($rating, range(8, 10, 0.1)):
        $return['movie_rating'] = 5;
        break;
    default:
        $return['movie_rating'] = 'n/A';
}

伙计们,老实说,这让我发疯。任何建议将不胜感激! TIA.

问题发生是因为 floating point math is not precise

为了避免它,我建议以这种方式重写这段代码:

if ($rating >= 8) $return['movie_rating'] = 5;
elseif ($rating >= 7) $return['movie_rating'] = 4;
elseif ($rating >= 6) $return['movie_rating'] = 3;
elseif ($rating >= 5) $return['movie_rating'] = 2;
elseif ($rating >= 1) $return['movie_rating'] = 1;
else  $return['movie_rating'] = 'n/A';