我想取任何实数,并返回最接近的数字,以及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 ¼ ¼
case $decimal > 0.375 && $decimal < 0.625:
return $number . '½'; # 189 ½ ½
case $decimal > 0.625 && $decimal < 0.875:
return $number . '¾'; # 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½
扩大我的想法!
答案 0 :(得分:2)
您实施了一个静态编译的搜索算法来挑选分数。只要unicode分数的数量变化不大(它不会变化),那么你所拥有的就好了。继续前进。
如果你生活在一个经常改变unicode分数的世界里。然后你应该将搜索从硬编码切换到数据驱动。只需要一个分数值表和它们的unicode等价物。在表中搜索最接近的分数,然后使用关联的unicode char。
答案 1 :(得分:2)
对于十进制介于0.125和0.875之间的情况,一个可能是“聪明的”并采取(188 +(十进制-0.125)* 4),但这比聪明的IMO更加模糊。也就是说,你可能希望你的最后一个案例是&gt; 0.875而不是&lt; 0.875
答案 2 :(得分: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;
你不应该在这里使用一个开关,而应该使用if语句(例如,如果你输入0,它看起来会有效,但是会产生意想不到的结果,因为你实际上是将$decimal
与结果进行比较表达式$decimal < 0.125
):
if ($decimalPart <= 0.25) {
# ...
} else if ($decimalPart <= 0.5) {
# ...
} else if ...