Xpoint
   [напомнить пароль]

Килобайт или Мегабайт?

Метки: [без меток]
2005-03-09 14:53:00 [обр] Tony(1/52)[досье]

819 b или 1 KB?
819 KB или 1 MB?
819 MB или 1 GB?

Одним словом — когда можно забивать на точность размера данных и переходить на порядок выше?

Если это 819 b, то учитывая мизерность размера данных можно с уверенностью написать 1 KB. Однако такое рассуждение не подходит, когда речь идет о размере 819 MB, так как 205 MB, которые дополняют число до гигабайта, немалый объем. Как, по какой формуле определять границу для перехода на порядок выше при передаче размера данных?

спустя 4 минуты [обр] Евгений Бондарев aka Eugene Bond(3/1600)[досье]

имхо, надо оперировать целыми величинами (не меньше 1) с точностью до 2-х знаков после запятой.
типа:

819 B но 1,82 KB
819 KB но 1,82 MB

спустя 1 минуту [обр] Сергей Круглов(10/2057)[досье]

я бы показывал, например, из расчета "не более 3 значащих цифр".
819 - так и будет 819

а 10350 - 10.3 Кб (с поправкой на 1024, а не 1000, просто считать не хочется и наглядность пострадает)

спустя 3 минуты [обр] Дмитрий Донцов+++(0/68)[досье]

можно плясать от печки, печкой будут байты.... переводите все в них. а потом установите некоторое ограничение ограничение, опять же в байтах.

если ограничение не превышено, переводим единицы измерения в единицы следующего порядка.
если превышено - оставляем как есть...

спустя 2 минуты [обр] Tony(1/52)[досье]
а 10350 - 10.3 Кб (с поправкой на 1024, а не 1000, просто считать не хочется и наглядность пострадает)
А если 10890 байт. Как будете писать? 11 KB, 10.89 KB или 10.9 KB? По всей логике лучше 11 KB, согласны? То есть, я хочу сказать, что чем выше разрядность, тем больше тот порог, который позволяет забить на точность.
спустя 2 минуты [обр] Tony(1/52)[досье]
Для нас плюс/минус 10 килобайт не играют роли. Но плюс/минус 10 мегабайт уже объем (даже в контексте гигабайтов), который чтобы просто так округлить, надо задуматься.
спустя 17 минут [обр] Сергей Круглов(10/2057)[досье]

В контексте гигабайтов мегабайты тоже роли не играют... Вам не все равно, весит DVD-фильм 8 ГЬ или 8.35 ГБ?
Главное, чтоб на болванку влезал...

Особой логики в 11 КБ вместо 10.9К Б, признаться, не вижу... У вас там каждый символ на счету? Ну округляйте до 2 знаков, если счет пошел на что-то крупнее байтов.

спустя 6 минут [обр] Tony(1/52)[досье]
Сергей Круглов[досье]
Меня больше не округление интересует, а рубеж перехода на следующий порядок.
спустя 9 минут [обр] Николай Бубело(1/113)[досье]

Я когда-то делал подобную задачу следующим образом (привожу сразу PHP код):

if ($size>(1024*1024*1024)) $size=round($size/(1024*1024*1024),3)." Gb";
elseif ($size>(1024*1024)) $size=round($size/(1024*1024),2)." Mb";
elseif ($size>1024) $size=round($size/1024,0)." Kb";
else $size=$size." b";

Общий принцип следующий: начиная с килобайтных размеров, увеличение размера на 3 порядка увеличивает точность на один или два порядка (хотя это во многом определяется спецификой данных).

Результат можно посмотреть здесь (см. в левой колонке):
http://bkd.dp.ua/soft/cti/
NB: надеюсь, модератор не сочтет эту ссылку рекламой

спустя 27 минут [обр] Tony(1/52)[досье]
Посмотрите, пожалуйста, мой пример. Что скажете по поводу такой логики? (начал писать объяснение алгоритма — оказалось, что проще прочитать код)
  /**
  * Abbreviate bytes count. If $fix_decimal is true, abbreviation will contain
  * decimal part always.
  *
  * @param integer $bytes
  * @param integer $fix_decimal
  * @return string
  */
  function abbreviate_bytes($bytes, $fix_decimal = false) {
      $map = array(5 => 'PB', 4 => 'TB', 3 => 'GB', 2 => 'MB', 1 => 'KB', 0 => 'B');
      $return = '0 B';
      foreach ($map as $number => $abbreviation) {
          $rounded = $bytes / pow(2, $number * 10);
          if ($rounded >= 0.5) {
              $return = round($rounded, 1);
              if (!$fix_decimal && (ceil(log($return, 10)) > $number)) {
                  $return = round($return);
              }
              $return = $return . ' ' . $abbreviation;
              break;
          }
      }
      return $return;
  }
спустя 1 минуту [обр] Tony(1/52)[досье]
(не переводите, пожалуйста, эту тему в PHP, так как это больше удобство использования, чем кодирование)
Powered by POEM™ Engine Copyright © 2002-2005