У меня миллионы длинных номеров (5216672577
) в файлах данных CSV, и я хотел бы уменьшить размер файла. Я планирую сделать это, округляя как можно больше завершающих цифр до 0, оставаясь в пределах X
% точности к оригинальному номеру. Тогда я переведу цифры в научную запись. Я предпочитаю формат 103e7
в 1.03E+7
, Символы точки и плюс добавляют ненужные байты. Я работаю с целыми числами.
Обновление — я получил его на работу:
for($i = 9000; $i < 11000; $i++) {
echo notation($i), "\r\n<br>";
}
// Round and abbreviate an integer
function notation($int, $precision=0.01) {
// We cannot shorten small numbers
if(is_int($int) && $int >= 1000) {
$best = $int;
// For each decimal place
$l = strlen($int);
for($i = 3; $i <= $l - 1; $i++) {
// Round to the deciaml place
$newInt = round($int, -$i);
// Check precision
$ratio = $int / $newInt;
if($ratio < (1 - $precision) || $ratio > (1 + $precision)) {
break;
}
// Save the best option
$best = $newInt;
}
// Count and remove trailing zeros
$l = strlen($best);
$best = rtrim($best, '0');
$i = $l - strlen($best);
// Check that we can actually shorten the int
if ($i >= 3) {
// Add scientific Notation
return $best . 'e' . $i;
}
}
return $int;
}
Задача ещё не решена.
Других решений пока нет …