Onların yakın (UTF-8 Karakter) Kesir içine Floats Torna

3 Cevap php

Ben herhangi bir gerçek sayı almak ve uygun UTF-8 karakter seti, kullanılabilir olarak yakın fraksiyonu ile, en yakın numarayı dönmek istiyorum.

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

Ben bu görevi yapmak için bu işlevi yaptı:

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

Bunu yapmak için daha iyi / diffrent yolu nedir?

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½

Aklımı genişletin!

3 Cevap

Bir ondalık kısmının varlığı güvenmemelisiniz:

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

Bunun yerine bu deneyin:

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

Burada bir anahtarı kullanmak, ama olmamalı yerine tablolarda ise (o çalışıyor gibi görünüyor ama beklenmedik bir sonuç verecektir eğer giriş 0, örneğin, aslında ifadenin sonucu $decimal karşılaştırdığınız beri $decimal < 0.125):

if ($decimalPart <= 0.25) {
    # ...
} else if ($decimalPart <= 0.5) {
    # ...
} else if ...

Sen kesirleri toplamak için bir statik derlenmiş arama algoritması uygulanmaktadır. Bu yüzden uzun unicode fraksiyonların sayısı olarak, o zaman ne var gayet iyi (ki böyle olmaz) çok değişmez. Üzerinde hareket ettirin.

Eğer bir dünyada yaşıyor olsaydı nerede unicode fraksiyonlar sık ​​sık değiştirin etmedi. Sonra sabit veri odaklı için kodlanmış olmaktan aramanızı geçmelisiniz. Sadece fraksiyonu değerleri ve unicode eşdeğer bir tablo var. Yakın kısmı için masa aramak, daha sonra ilişkili unicode karakter kullanın.

Bir ondalık 0.125 ile 0.875 arasında olduğu, ancak zaman (* 4) 188 + (ondalık 0,125) durumda olduğunu IMO, zeki daha şaşırtma olurdu "zeki" olması ve sürebilir. O dedi, muhtemelen son durum> 0.875 ve değil olmak istiyorum < 0.875.