php如何在不进行数字舍入的情况下将文件大小从字节单位缩短到更大的单位

php如何在不进行数字舍入的情况下将文件大小从字节单位缩短到更大的单位,php,numbers,byte,rounding,Php,Numbers,Byte,Rounding,让我举一个例子来解释我所期望的。 例子: 我的文件大小为“3147483648字节”,我想将其转换为以下适当的文件大小: 2 GB+70 MB+333 KB+512字节 非常感谢您的帮助。您可以为此编写自己的函数: 差不多 bytes = filesize % 1024; filesize = (int)(filesize / 1024); kbytes = filesize % 1024; filesize = (int)(filesize / 1024); 等等…我找到了解决办法。我真的不

让我举一个例子来解释我所期望的。 例子: 我的文件大小为“3147483648字节”,我想将其转换为以下适当的文件大小: 2 GB+70 MB+333 KB+512字节


非常感谢您的帮助。

您可以为此编写自己的函数: 差不多

bytes = filesize % 1024;
filesize = (int)(filesize / 1024);
kbytes = filesize % 1024;
filesize = (int)(filesize / 1024);

等等…

我找到了解决办法。我真的不喜欢它如何使用递归,但它得到了我想要的

function shortenBytes($sizeInBytes){

    $units = array('Bytes', 'KB', 'MB', 'GB', 'TB', 'PB' , 'EB', 'ZB', 'YB');

    $resultArray = array(
        'YB' => 0,'ZB' => 0,'EB' => 0,'PB' => 0,'TB' => 0,
        'GB' => 0,'MB' => 0,'KB' => 0,'Bytes' => 0);

    $remainder = $sizeInBytes;
    $i = count($units);
    while($i >= 0)
    {
        $pownumber = pow(1024, $i);

        if($sizeInBytes >= $pownumber){
            $resultArray[$units[$i]] = (int)($sizeInBytes / $pownumber);
            $remainder = abs($sizeInBytes % $pownumber);
            $i--;
            $remainder = recursiveGetUnitArray($remainder,$i,$resultArray);
        }
        $sizeInBytes = $remainder;
        $i--;
    }

    return $resultArray;
}

function recursiveGetUnitArray($sizeInBytes, $i, &$resultArray){
    $units = array('B', 'KB', 'MB', 'GB', 'TB', 'PB' , 'EB', 'ZB', 'YB');


    $remainder = $sizeInBytes;

    $pownumber = pow(1024, $i);
    if($sizeInBytes >= $pownumber){
        $resultArray[$units[$i]] = (int)($sizeInBytes / $pownumber);
        $remainder = abs($sizeInBytes % $pownumber);
        $i--;
        $remainder = recursiveGetUnitArray($remainder,$i,$resultArray);
    }
    return $remainder;
}
shortenBytes结果(3147483648)


请参见php.net官方网站:

<?php
function human_filesize($bytes, $decimals = 2) {
  $sz = 'BKMGTP';
  $factor = floor((strlen($bytes) - 1) / 3);
  return sprintf("%.{$decimals}f", $bytes / pow(1024, $factor)) . @$sz[$factor];
}
?>


这与将秒转换为天/小时/分钟/秒相同。试着用谷歌搜索一下。
kb=floor(bytes/1024)
,然后将其从原始的
bytes-=kb
中删除,并重复搜索更大的面额。我搜索了许多代码,它们都是关于从字节到任何特定的更大单位的,但不是我想要的。在您的回答中,为什么我必须再次将文件大小除以1024?我认为应该从单元的顶端开始计算,而不是从字节到更高的单元。上面提到过,这不是我的问题。
<?php
function human_filesize($bytes, $decimals = 2) {
  $sz = 'BKMGTP';
  $factor = floor((strlen($bytes) - 1) / 3);
  return sprintf("%.{$decimals}f", $bytes / pow(1024, $factor)) . @$sz[$factor];
}
?>