使用开关和范围确定一个值
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';
我编写了以下代码来根据电影的 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';