1

我想取任何实数,并返回最接近的数字,以及 UTF-8 字符集中可用的最接近的分数。

0/4 = 0.00 =   # < .125
1/4 = 0.25 = ¼ # > .125 & < .375
2/4 = 0.50 = ½ # > .375 & < .625
3/4 = 0.75 = ¾ # > .625 & < .875
4/4 = 1.00 =   # > .875

我做了这个功能来完成这项任务:

function displayFraction($realNumber)
{
    if (!is_float($realNumber))
    {
        return $realNumber;
    }
    list($number, $decimal) = explode('.', $realNumber);
    $decimal = '.' . $decimal;
    switch($decimal)
    {
        case $decimal < 0.125:
            return $number;
        case $decimal > 0.125 && $decimal < 0.375:
            return $number . '¼'; # 188 ¼ &#188;
        case $decimal > 0.375 && $decimal < 0.625:
            return $number . '½'; # 189 ½ &#189;
        case $decimal > 0.625 && $decimal < 0.875:
            return $number . '¾'; # 190 ¾ &#190;
        case $decimal < 0.875:
            return ++$number;
    }
}

有什么更好/不同的方法来做到这一点?

echo displayFraction(3.1) . PHP_EOL;      # Outputs: 3
echo displayFraction(3.141593) . PHP_EOL; # Outputs: 3¼
echo displayFraction(3.267432) . PHP_EOL; # Outputs: 3¼
echo displayFraction(3.38) . PHP_EOL;     # Outputs: 3½

扩展我的思维!

4

3 回答 3

2

您实现了一个静态编译的搜索算法来挑选分数。只要 unicode 分数的数量没有太大变化(它不会),那么你所拥有的就可以了。继续。

如果你生活在一个 unicode 分数确实经常变化的世界里。然后,您应该将搜索从硬编码转换为数据驱动。只需有一个分数值表和它们的 unicode 等价物。在表格中搜索最接近的分数,然后使用关联的 unicode char。

于 2010-03-15T18:56:46.207 回答
2

当十进制在 0.125 和 0.875 之间时,一个可能是“聪明的”并采用 (188 + (decimal-0.125) * 4) ,但这比聪明的 IMO 更令人困惑。也就是说,您可能希望最后一个案例 > 0.875 而不是 < 0.875。

于 2010-03-15T18:59:15.163 回答
1

您不应该依赖小数部分的存在:

# Will generate a STRICT warning if $realNumber does not contain a full stop:
list($number, $decimal) = explode('.', $realNumber);

试试这个:

$integerPart = floor($realNumber);
$decimalPart = $realPart - $integerPart;

您不应该在此处使用 switch,而应使用 if 语句(例如,如果您输入 0,它看起来像是在工作,但会给出意外的结果,因为您实际上是$decimal在与表达式的结果进行比较$decimal < 0.125):

if ($decimalPart <= 0.25) {
    # ...
} else if ($decimalPart <= 0.5) {
    # ...
} else if ...
于 2010-03-15T19:00:12.870 回答