За последние 24 часа нас посетили 51320 программистов и 1758 роботов. Сейчас ищут 754 программиста ...

Странное деление больших чисел

Тема в разделе "PHP для новичков", создана пользователем el, 16 окт 2010.

  1. el

    el Активный пользователь

    С нами с:
    23 окт 2006
    Сообщения:
    51
    Симпатии:
    0
    Адрес:
    Ташкент
    Узнаю размер папки в байтах, выводит правильно 7336517, а дальше начинаются весёлости: Если начинаю делить, сравнивать (пытался просто сравнить $size с 1048576 - выдаёт, что сайз меньше чем 1048576) в числе появляется запятая (точка) и размер папки без округления становится 182.430624303 Кб.
    Думал может с типом данных что-то не так, но PHP не поддерживает явного объявления типов данных, просто return 7336517/1024; выводит всё правильно. В чем загвоздка? откуда эти 182 Кб вместо 7 Мб?
    PHP:
    1.  
    2. function dirsize($d)
    3. {
    4.  $dh = opendir( $d );
    5.   $size = 0;
    6.   while( ( $f = readdir( $dh ) ) !== false )
    7.    {
    8.     if ( $f != "." && $f != ".." )
    9.      {
    10.       $path = $d . "/" . $f;
    11.       if( is_dir( $path ) )
    12.        {  $size += dirsize( $path );  }
    13.       elseif( is_file( $path ) )
    14.        {  $size += filesize( $path );  }
    15.      }
    16.    }
    17.   //return $size; <- если раскомментить - выведет правильно в байтах
    18.   $kb=$size/1024;
    19.   $mb=$kb/1024;
    20.   $gb=$mb/1024;
    21.   closedir($dh);
    22.   if ($size>1024)
    23.   {
    24.     if ($kb<1024)
    25.     {
    26.         return $kb.' Кб';
    27.     }
    28.     else
    29.     {
    30.         if ($mb<1024)
    31.         {
    32.             return $mb.' Мб';
    33.         }
    34.         else
    35.         {
    36.             return $gb.' Гб';
    37.         }
    38.     }
    39.   }
    40.   else
    41.   {
    42.     return $size.' байт';
    43.   }
    44. }
     
  2. MaXyC_Web_Studio

    MaXyC_Web_Studio Активный пользователь

    С нами с:
    31 дек 2006
    Сообщения:
    678
    Симпатии:
    3
    Адрес:
    Новоуральск
    косяг в коде где то. пых не причем =)
     
  3. el

    el Активный пользователь

    С нами с:
    23 окт 2006
    Сообщения:
    51
    Симпатии:
    0
    Адрес:
    Ташкент
    Я ващпе понять не могу все эти странности - до тех пор пока "сайз" с чем-нибудь не сравнил - он нормальный, как только сравнил - сразу запятая берётся откуда-то и число "левое" какое-то.

    Может есть у кого функция "определения размера папки" что бы заодно байты в Кб, Мб и Гб переводила? в своём примере уже не знаю куда копать - яндекс много мне посоветовал и везде одно и то же - размер папки все функции, которые я нашёл, определяют правильно, а переводят в Кб, Мб и Гб все так же как у меня - неправильно.

    Проблема началась только тогда, когда размер папки стал больше 512 Мб, до этого у меня как-то всё работало.
     
  4. siiXth

    siiXth Активный пользователь

    С нами с:
    14 мар 2010
    Сообщения:
    1.447
    Симпатии:
    1
    действительно забавно
    5304636 байт
    делим в калк.ехе на 1024
    получаем 5180,30859375

    в пхп те же самые действия=55.0330008907
    и дело даже не в точке...цифры не похожи :D
     
  5. vasa_c

    vasa_c Активный пользователь

    С нами с:
    22 мар 2006
    Сообщения:
    1.760
    Симпатии:
    0
    Адрес:
    гор.Ленинград
    если выкинуть все опендиры и просто написать:
    PHP:
    1. $size = 7336517;
    2. ...
    Нормально делить будет или нет?
     
  6. siiXth

    siiXth Активный пользователь

    С нами с:
    14 мар 2010
    Сообщения:
    1.447
    Симпатии:
    1
    всё , встречайте дибила :D
    я думал оно и вложенные папки сканирует ))
    размер файлов в папке считает правильно
     
  7. vasa_c

    vasa_c Активный пользователь

    С нами с:
    22 мар 2006
    Сообщения:
    1.760
    Симпатии:
    0
    Адрес:
    гор.Ленинград
    ну билять, у вас рекурсивный обход с $size += dirsize( $path ); а вы из неё всякую хрень возвращаете
     
  8. siiXth

    siiXth Активный пользователь

    С нами с:
    14 мар 2010
    Сообщения:
    1.447
    Симпатии:
    1
    http://gloomm.blogspot.com/2008/04/php.html

    чтото мне подсказывает что ктото не прав :D
     
  9. Apple

    Apple Активный пользователь

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    PHP:
    1. <?php
    2. /**
    3.  * Get the directory size
    4.  * @param directory $directory
    5.  * @return integer
    6.  */
    7. function dirSize($directory) {
    8.     $size = 0;
    9.     foreach(new RecursiveIteratorIterator(new RecursiveDirectoryIterator($directory)) as $file){
    10.         $size+=$file->getSize();
    11.     }
    12.     return $size;
    13. }
    14. ?>
     
  10. el

    el Активный пользователь

    С нами с:
    23 окт 2006
    Сообщения:
    51
    Симпатии:
    0
    Адрес:
    Ташкент
    Именно! самое что интересное просто при таком раскладе выдаёт правильно: 6.99664783478 Мб, если с сайзом ничего не делать - просто вывести - тоже правильно в байтах покажет, а вот когда начинаю сравнивать, делить - попа получается.
    Всё там нормально, минимум 3 функции перепробовал, не считая своей, что бы исключить свои ошибки, в яндексе "размер папки PHP" и пробую - результат у всех один.
    Вот оно! Счастье в жизни! До сих пор не понимаю в чём был подвох, но это тпример на пару с моей функцией перевода байты в "Кб, Мб и Гб" работает нормально, Спасибо!
     
  11. vasa_c

    vasa_c Активный пользователь

    С нами с:
    22 мар 2006
    Сообщения:
    1.760
    Симпатии:
    0
    Адрес:
    гор.Ленинград
    билять, я намекнул где подвох в сообщении начинающемся с "ну билять".
     
  12. karlozzz

    karlozzz Активный пользователь

    С нами с:
    24 окт 2010
    Сообщения:
    430
    Симпатии:
    0
    Адрес:
    Y-OLA
    Твоя функция рекурсивно вызывает саму себя, следовательно если хочешь возвр результат в другом виде пиши новую ф-ю, которая вызывает эту и обрабатывает ответ, можно класс, короч проблема в рекурсии смотри внимательно
     
  13. el

    el Активный пользователь

    С нами с:
    23 окт 2006
    Сообщения:
    51
    Симпатии:
    0
    Адрес:
    Ташкент
    Какая полезная ссылочка, и чего же она вчера мне не открылась. супер, спасибо.
    всё, понял, спасибо.