Php 浮点值的错误字符串表示形式

Php 浮点值的错误字符串表示形式,php,factorial,floating-point-conversion,Php,Factorial,Floating Point Conversion,我用这个函数计算阶乘: function factorial($in) { // 0! = 1! = 1 $out = 1; // Only if $in is >= 2 for ($i = 2; $i <= $in; $i++) { $out *= $i; } return $out; } 函数阶乘($in){ // 0! = 1! = 1 $out=1; //仅当$in大于等于2时 因为($i=2;$i2585

我用这个函数计算阶乘:

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

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

    return $out;
}
函数阶乘($in){
// 0! = 1! = 1
$out=1;
//仅当$in大于等于2时

因为($i=2;$i
25852016738884978212864
对于PHP来说太大了,无法将其存储在32位int中,这是浮点精度的噩梦,我不知道您将如何解决甚至缓解这个问题,但这是我的理论。
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