Converting float decimal to fraction

前端 未结 6 876
粉色の甜心
粉色の甜心 2020-12-05 15:32

I am trying to convert calculations keyed in by users with decimal results into fractions. For e.g.; 66.6666666667 into 66 2/3. Any pointers? Thanx in advance

6条回答
  •  天涯浪人
    2020-12-05 16:27

    Sometimes it is necessary to treat only the decimals of a float. So I created a code that uses the function created by @Joni to present a format that is quite common in culinary recipes, at least in Brazil.

    So instead of using 3/2 which is the result for 1.5, using the function I created it is possible to present the value 1 1/2, and if you want, you can also add a string to concatenate the values, creating something like "1 and 1/2 ".

    function float2rat($n, $tolerance = 1.e-6) {
      $h1=1; $h2=0;
      $k1=0; $k2=1;
      $b = 1/$n;
      do {
          $b = 1/$b;
          $a = floor($b);
          $aux = $h1; $h1 = $a*$h1+$h2; $h2 = $aux;
          $aux = $k1; $k1 = $a*$k1+$k2; $k2 = $aux;
          $b = $b-$a;
      } while (abs($n-$h1/$k1) > $n*$tolerance);
    
      return "$h1/$k1";
    }
    
    function float2fraction($float, $concat = ' '){
      
      // ensures that the number is float, 
      // even when the parameter is a string
      $float = (float)$float;
    
      if($float == 0 ){
        return $float;
      }
      
      // when float between -1 and 1
      if( $float > -1 && $float < 0  || $float < 1 && $float > 0 ){
        $fraction = float2rat($float);
        return $fraction;
      }
      else{
    
        // get the minor integer
        if( $float < 0 ){
          $integer = ceil($float);
        }
        else{
          $integer = floor($float);
        }
    
        // get the decimal
        $decimal = $float - $integer;
    
        if( $decimal != 0 ){
    
          $fraction = float2rat(abs($decimal));
          $fraction = $integer . $concat . $fraction;
          return $fraction;
        }
        else{
          return $float;
        }
      }
    }
    

    Usage e.g:

    echo float2fraction(1.5);
    will return "1 1/2"
    

提交回复
热议问题