如何用零舍入/格式化长数字?

时间:2018-09-29 14:00:54

标签: php math numbers format rounding

我有各种各样的长号,并且我试图编写一个函数来正确格式化它们。有人可以帮我吗?

我已经尝试过“ 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”,则应四舍五入到小数点后两位,并添加千位分隔符(如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 :(得分:1)

适应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

答案 1 :(得分:0)

$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.10.001之类的数字无法精确存储,因此它们实际上存储为0.09999999...或类似的东西。在这种情况下,似乎计算错了,并为您提供了比有效位数更多的答案。

您可以尝试通过允许公式的误差范围来抵消这种现象:

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

但这可能会导致其他不良影响。您将必须进行测试。