Как округлить / отформатировать длинные числа с нулями? - PullRequest
0 голосов
/ 29 сентября 2018

У меня есть множество длинных чисел, и я пытаюсь написать функцию для их правильного форматирования.Кто-нибудь может мне помочь?

Я уже пробовал "number_format()" и "round()", но это не решает мои проблемы ..

Я хотел бы округлить его, как показано ниже:

1024.43  --> 1,024.43  
0.000000931540 --> 0.000000932  
0.003991 --> 0.00399  
0.3241 --> 0.324
1045.3491 --> 1,045.35

Таким образом, это означает, что если число больше «0», оно должно округляться до 2 десятичных знаков и добавлять разделитель тысяч (например, 6,554.24), а если число меньше «1», оно должно округляться до 3цифры, когда числа появляются после нулей (например, от 0,0003219 до 0,000322 ИЛИ от 0,2319 до 0,232)

РЕДАКТИРОВАТЬ: То же самое должно применяться к значениям "-".Например:

-1024.43  --> -1,024.43  
-0.000000931540 --> -0.000000932  
-0.003991 --> -0.00399  
-0.3241 --> -0.324
-1045.3491 --> -1,045.35

Ответы [ 2 ]

0 голосов
/ 29 сентября 2018
$x = 123.456;
echo number_format($x, max(2, 3 - ceil(log10(abs($x))))) . "\n";
$x = 1.23456;
echo number_format($x, max(2, 3 - ceil(log10(abs($x))))) . "\n";
$x = 0.0123456;
echo number_format($x, max(2, 3 - ceil(log10(abs($x))))) . "\n";
$x = 0.0000123456;
echo number_format($x, max(2, 3 - ceil(log10(abs($x))))) . "\n";
$x = 0.000000123456;
echo number_format($x, max(2, 3 - ceil(log10(abs($x))))) . "\n";
$x = 0.00000000123456;
echo number_format($x, max(2, 3 - ceil(log10(abs($x))))) . "\n";

Вывод:

123.45
1.23
0.0123
0.0000123
0.000000123
0.00000000123

В основном это всегда содержит минимум 2 десятичных цифры до 3 значащих цифр.

Однако из-за способа обработки плавающей запятой внутри(как сила 2, а не 10), есть некоторые уловы.Числа типа 0.1 и 0.001 и т. Д. Не могут быть сохранены точно, поэтому они на самом деле хранятся как 0.09999999... или тому подобное.В таких случаях может показаться, что он неправильно вычисляет вещи и дает вам ответы с более значительными цифрами, чем следовало бы.

Вы можете попытаться противодействовать этому явлению, допустив предел ошибки для формулы:

number_format($x, max(2, 3 - ceil(log10(abs($x))) - 1e-8))

Но это может вызвать другие нежелательные эффекты.Вам придется делать тесты.

0 голосов
/ 29 сентября 2018

Адаптация от https://stackoverflow.com/a/48283297/2469308

  • обрабатывать это в двух отдельных случаях.
  • для чисел от -1 до 1;нам нужно рассчитать количество цифр для округления.И затем, используя функцию number_format () , мы можем получить результат.
  • для других, просто используйте функцию number_format () с десятичными цифрами, установленными на 2.

Попробуйте следующее:

function customRound($value)
{
   if ($value > -1 && $value < 1) {

       // define the number of significant digits needed
       $digits = 3;

       if ($value >= 0) {

           // calculate the number of decimal places to round to
           $decimalPlaces = $digits - floor(log10($value)) - 1;
       } else {

           $decimalPlaces = $digits - floor(log10($value * -1)) - 1;
       }

       // return the rounded value
       return number_format($value, $decimalPlaces);

   } else {

      // simply use number_format function to show upto 2 decimal places
      return number_format($value, 2);
    } 

    // for the rest of the cases - return the number simply
    return $value;
}

Rextester DEMO

...