Массивы — исправлена ​​ошибка преобразования дробного короткого фрагмента PHP, проблема с вычислением при преобразовании дроби в более читаемый формат.

Вот проблема, когда он встречает дроби вроде: 300/10 вместо того, чтобы давать результат «30», следующий код дает мне: 1/0

$tokens = explode('/', $value);
while ($tokens[0] % 10 == 0) {
$tokens[0] = $tokens[0] / 10;
$tokens[1] = $tokens[1] / 10;
}
if ($tokens[1] == 1) {
return $tokens[0].' s';
} else {
return '1/'.floor(1/($tokens[0]/$tokens[1])).' s';
// return $tokens[0].'/'.$tokens[1].' s';
}

Спасибо

0

Решение

Вы должны изменить строку while($tokens[0] % 10 === 0 && $tokens[1] % 10 === 0) { в while($tokens[0] % 10 === 0 && $tokens[1] % 10 === 0) {,

И линия return '1/'.floor(1/($tokens[0]/$tokens[1])).' s'; не надежно

Если вы хотите уменьшить дроби, попробуйте эту функцию:

function reduceFraction($fraction) {
sscanf($fraction, '%d/%d %s', $numerator, $denominator, $junk);

// TODO: validation

if( $denominator === null ) {
return (string)$numerator;
}

if( $numerator === $denominator ) {
return 1;
}

$max = max(array($numerator, $denominator));
for($i = 1; $i < $max; ++$i) {
if( $denominator % $i === 0 && $numerator % $i === 0) {
$common = $i;
}
}

if( $denominator === $common ) {
return (string)($numerator / $common);
}

return ($numerator / $common) . '/' . ($denominator / $common);
}

Вы можете использовать это так:
ReductionFraction (‘300/10’). ‘s’;

Также возможно обобщить функцию для цепных дробей (например: «300/100/10»). Я могу отправить реализацию этого, если вы хотите.

0

Другие решения

скажите мне почему «while ($ tokens [0]% 10 == 0» && $ tokens [1]% 10 == 0) «лучше использовать, чем просто» while ($ tokens [0]% 100 == 0) «, так как
оба метода работают нормально

Если вы попытаетесь использовать строку «3000/10» в качестве аргумента для каждой реализации, то с while ($tokens[0] % 10 == 0 && $tokens[1] % 10 ==0) вернусь 300 s, а другой с while ($tokens[0] % 100 == 0) вернусь 1/0 s,

Если вы используете while ($tokens[0] % 100 == 0) Метод, итерации цикла:

  1. $tokens[0] = 3000 / 10 = 300;
    $tokens[1] = 10 / 10 = 10;
  2. $tokens[0] = 30 / 10 = 30;
    $tokens[1] = 10 / 1 = .1;

    Остановился, потому что 30% 100! = 0.
    Поскольку $ token [1] не равен 1, он не возвращает «30 с».
    1/30 меньше нуля (0,0333 …), поэтому floor (1/30) = 0. Вот почему он возвращает «1/0 с».

Если вы используете while ($tokens[0] % 10 == 0 && $tokens[1] % 10 == 0) Метод, итерации цикла:

  1. $tokens[0] = 3000 / 10 = 300;
    $tokens[1] = 10 / 10 = 1;

    Остановлено, потому что 1% 10! = 0.
    Так как $ token [1] не равен 1, он возвращает «30 с».

Это лучше, потому что он будет работать с большим количеством входов.

Но я рекомендую вам использовать функцию «reduFraction», которую я реализовал.

Он использует метод максимального общего знаменателя для сокращения функций.

  • echo reduceFraction('3000/10'); выходы «300».
  • echo reduceFraction('300/10'); выходы «30».
  • echo reduceFraction('30/10'); выходы «3».
  • echo reduceFraction('3/10'); выходы «3/10».
  • echo reduceFraction('3/3'); выходы «1».
  • echo reduceFraction('222/444'); выходы «1/2».
  • echo reduceFraction('444/222'); выходы «2».
0

По вопросам рекламы [email protected]