Неверное строковое представление значения с плавающей точкой

Я использую эту функцию для расчета факториала:

function factorial($in) {
// 0! = 1! = 1
$out = 1;

// Only if $in is >= 2
for ($i = 2; $i <= $in; $i++) {
$out *= $i;
}

return $out;
}

И пытается преобразовать значение с плавающей точкой в ​​какое-то представление строки bigint. Но начиная с 23! значение результата неверно. Выход:

2.5852016738885E+22 <- this is the result (float)
25852016738884978212864 <- incorrect
25852016738884978212864 <- incorrect
25852016738884976640000 <- correct (used GMP library for calculation)

Сам скрипт:

<?php

//starting from 23 the result becomes incorrect if convert it to "integer string"define('F_NUMBER', 23);

function factorial($in) {
// 0! = 1! = 1
$out = 1;

// Only if $in is >= 2
for ($i = 2; $i <= $in; $i++) {
$out *= $i;
}

return $out;
}$f = factorial(F_NUMBER);
echo "$f" . PHP_EOL; //The result as float
echo number_format($f, 0, '', '') . PHP_EOL; //Incorrect result
printf("%.0f" . PHP_EOL, $f); //Incorrect result
echo gmp_strval(gmp_fact(F_NUMBER)) . PHP_EOL; //Correct result

Почему это происходит? Как решить эту проблему без библиотеки GMP?

1

Решение

Задача ещё не решена.

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

Других решений пока нет …

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