function decimal_to_fraction($float) { $float = clean_number($float); $whole = floor($float); $decimal = $float - $whole; $leastCommonDenom = 384; // 128 * 3; $denominators = array (2, 3, 4, 8, 16, 24, 48, 64, 128); $roundedDecimal = round ($decimal * $leastCommonDenom) / $leastCommonDenom; if ($roundedDecimal == 0) return $whole; if ($roundedDecimal == 1) return $whole + 1; foreach ( $denominators as $d ) { if ($roundedDecimal * $d == floor ($roundedDecimal * $d)) { $denom = $d; break; } } return ($whole == 0 ? '' : $whole) . " " . ($roundedDecimal * $denom) . "/" . $denom; } /* Example */ echo decimal_to_fraction(.5).'
'; echo decimal_to_fraction(.25).'
'; echo decimal_to_fraction(.75).'
'; echo decimal_to_fraction(.125).'
'; echo decimal_to_fraction(.3046875).'
'; /* Output */ 1/2 1/4 3/4 1/8 39/128