【问题标题】:Show a number to two decimal places显示数字到小数点后两位
【发布时间】:2011-05-27 21:07:42
【问题描述】:

将 PHP 字符串四舍五入到小数点后两位的正确方法是什么?

$number = "520"; // It's a string from a database

$formatted_number = round_to_2dp($number);

echo $formatted_number;

输出应该是520.00;

round_to_2dp()函数定义应该如何?

【问题讨论】:

  • 这真的不是“四舍五入”。四舍五入降低精度。它不会为没有小数位的数字添加小数位。根据许多答案和 cmets,似乎人们认为舍入不是。 round 是一个数学函数,这只是一个格式问题。

标签: php formatting numbers rounding number-formatting


【解决方案1】:

你可以使用number_format():

return number_format((float)$number, 2, '.', '');

例子:

$foo = "105";
echo number_format((float)$foo, 2, '.', '');  // Outputs -> 105.00

这个函数返回一个字符串

【讨论】:

  • @ÁlvaroG.Vicario round 没有解决这里的 OP 问题。 round("520", 2) 返回浮点数 520,并且回显它当然不会显示到小数点后 2 位。对于 OP 的目的 - 通过用尾随零填充来显示整数到小数点后 2 位 - 您需要一个数字格式化函数,而不是舍入函数。
  • 所有其他答案仅限于带有点符号的十进制值。当您需要获取 520,00 而不是 520.00 时,这很有效。
  • 如果你只想限制 float 而不是 int 那么 bcdiv($number,1,2)
  • 我认为你应该使用 bcadd(0,$yournumber,2) 它会给你完美的结果。
【解决方案2】:

使用round()(如果您只期望浮点格式的数字,则使用,否则使用 number_format() 作为an answer given by Codemwnci):

echo round(520.34345, 2);   // 520.34
echo round(520.3, 2);       // 520.3
echo round(520, 2);         // 520

来自手册:

说明:

float round(float $val [, int $precision = 0 [, int $mode = PHP_ROUND_HALF_UP ]]);

val 的四舍五入值返回到指定的precision(小数点后的位数)。 precision 也可以是负数或零(默认)。

...

示例 #1 round() 示例

<?php
    echo round(3.4);         // 3
    echo round(3.5);         // 4
    echo round(3.6);         // 4
    echo round(3.6, 0);      // 4
    echo round(1.95583, 2);  // 1.96
    echo round(1241757, -3); // 1242000
    echo round(5.045, 2);    // 5.05
    echo round(5.055, 2);    // 5.06
?>

示例#2 模式示例

<?php
    echo round(9.5, 0, PHP_ROUND_HALF_UP);   // 10
    echo round(9.5, 0, PHP_ROUND_HALF_DOWN); // 9
    echo round(9.5, 0, PHP_ROUND_HALF_EVEN); // 10
    echo round(9.5, 0, PHP_ROUND_HALF_ODD);  // 9

    echo round(8.5, 0, PHP_ROUND_HALF_UP);   // 9
    echo round(8.5, 0, PHP_ROUND_HALF_DOWN); // 8
    echo round(8.5, 0, PHP_ROUND_HALF_EVEN); // 8
    echo round(8.5, 0, PHP_ROUND_HALF_ODD);  // 9
?>

【讨论】:

  • @khuderm round($number, 2); 不起作用。我想要 520.00 而不是 520。不敢相信 round 默认情况下不会这样做。
  • 它甚至没有正确回答 OP 但有超过 100 票!
  • 我想使用数字格式,但是当 100.00 时会返回 100。怎么样?
  • 但如果数字为 123.93 @SomnathMuluk,我需要 .93
  • @RobSedgwick 许多人正在寻找将 3.333333333 之后的剩余部分修剪为 3.33 等的功能。
【解决方案3】:

或者,

$padded = sprintf('%0.2f', $unpadded); // 520 -> 520.00

【讨论】:

  • 如果你想要520,00怎么办?我想在这种情况下,另一个答案效果更好。
  • ^no 其他答案不会为 int 给出两位小数
  • 你可能想要这个的其他原因是你不想四舍五入......或者在我的原因中返回的 SQL 浮点数与普通浮点数不同,这是一个 PHP 数学错误
  • @SPRBRN - number_format 具有指定小数分隔符的选项。
【解决方案4】:

http://php.net/manual/en/function.round.php

例如

echo round(5.045, 2);    // 5.05

echo round(5.055, 2);    // 5.06

【讨论】:

  • Round 将完成 Rich 想要的确切功能,但 number_format() 对于各种数字格式的研究会更有趣。
  • 此方法将执行舍入,而不是仅在末尾强制数字“.00”。
  • 我试过了,但它不起作用 - 它不会添加额外的 .00。
  • round(520, 2) 返回 520,而不是 @Rich 要求的 520.00
  • PHP 7.4+ 的更新,因为这个答案已经很老了。由于 round 返回一个浮点数,它只能保证返回一个最多有一个小数位的数字(即,它返回一个不是整数的东西,用最小的小数位来表示该数字)。所以round(1,2)(或任何级别或精度)返回“1.0”,因为“1.00”不是有效的浮点数。要使数字表现得像字符串,您需要使用字符串操作函数。 (以前版本的 PHP 可能表现不同/不太合乎逻辑)
【解决方案5】:

试试:

$number = 1234545454; 
echo  $english_format_number = number_format($number, 2); 

输出将是:

1,234,545,454.00

【讨论】:

  • 可行,但输出将是字符串而不是数字。
  • 如果你想使用 number_format 至少让它成为 number_format($number, 2, '.', '')
  • @Ethan - 正确,此问答是关于将数字格式化为字符串,并带有指定的小数位数。
【解决方案6】:

您可以使用 PHP printfsprintf 函数:

sprintf 为例:

$num = 2.12;
echo sprintf("%.3f", $num);

您也可以在没有echo 的情况下运行相同的程序。示例:sprintf("%.3f", $num);

输出:

2.120

或者,printf:

echo printf("%.2f", $num);

输出:

2.124

【讨论】:

    【解决方案7】:

    使用 PHP number_format() 函数。

    例如,

    $num = 7234545423;
    echo number_format($num, 2);
    

    输出将是:

    7,234,545,423.00
    

    【讨论】:

      【解决方案8】:

      解决此问题的另一种更奇特的方法是将bcadd()0 的$right_operand 的虚拟值一起使用。

      $formatted_number = bcadd($number, 0, 2);
      

      【讨论】:

      • 请注意,bc* 函数不会向上取整,它们总是向下取整。例如,bcadd("1.0999","0.0",1) 产生“1.0”,而不是“1.1”。
      • BC 数学函数实际上只是在$scale 小数位处停止处理。这等于向零舍入。
      【解决方案9】:
      bcdiv($number, 1, 2) // 2 varies for digits after the decimal point
      

      这将在小数点后精确显示两位数。

      优势:

      如果您只想在浮点值之后显示两位而不是 int,请使用它。

      【讨论】:

      • 如果你有 bcdiv,这是最通用的解决方案(它是 centos6 上的库存但非默认包)。
      【解决方案10】:
      $retailPrice = 5.989;
      echo number_format(floor($retailPrice*100)/100,2, '.', ''); 
      

      它将返回 5.98 而不四舍五入。

      【讨论】:

      • 只有这个也可以floor($retailPrice * 100) / 100;那么就不需要数字格式了。
      【解决方案11】:

      用于条件四舍五入,即。在真正需要的地方显示小数,否则为整数

      123.56 => 12.56

      123.00 => 123

      $somenumber = 123.56;
      
      $somenumber = round($somenumber,2);
      
      if($somenumber == intval($somenumber))
      {
          $somenumber = intval($somenumber);
      }
      
      echo $somenumber; // 123.56
      
      
      $somenumber = 123.00;
      
      $somenumber = round($somenumber,2);
      
      if($somenumber == intval($somenumber))
      {
          $somenumber = intval($somenumber);
      }
      
      echo $somenumber; // 123    
      

      【讨论】:

        【解决方案12】:

        使用 PHP number_format() 函数。

        【讨论】:

          【解决方案13】:

          这里我使用函数在.(点)之后得到两位小数...

          function truncate_number($number, $precision = 2) {
          
              // Zero causes issues, and no need to truncate
              if (0 == (int)$number) {
                  return $number;
              }
          
              // Are we negative?
              $negative = $number / abs($number);
          
              // Cast the number to a positive to solve rounding
              $number = abs($number);
          
              // Calculate precision number for dividing / multiplying
              $precision = pow(10, $precision);
          
              // Run the math, re-applying the negative value to ensure
              // returns correctly negative / positive
              return floor( $number * $precision ) / $precision * $negative;
          }
          

          上述函数的结果:

          echo truncate_number(2.56789, 1); // 2.5
          echo truncate_number(2.56789);    // 2.56
          echo truncate_number(2.56789, 3); // 2.567
          
          echo truncate_number(-2.56789, 1); // -2.5
          echo truncate_number(-2.56789);    // -2.56
          echo truncate_number(-2.56789, 3); // -2.567
          

          新的正确答案

          使用PHP原生函数bcdiv

          echo bcdiv(2.56789, 1, 1);  // 2.5
          echo bcdiv(2.56789, 1, 2);  // 2.56
          echo bcdiv(2.56789, 1, 3);  // 2.567
          echo bcdiv(-2.56789, 1, 1); // -2.5
          echo bcdiv(-2.56789, 1, 2); // -2.56
          echo bcdiv(-2.56789, 1, 3); // -2.567
          

          【讨论】:

          • 感谢您的更新。适用于经度和纬度。
          【解决方案14】:

          我自己做。

          $decimals = 2;
          $number = 221.12345;
          $number = $number * pow(10, $decimals);
          $number = intval($number);
          $number = $number / pow(10, $decimals);
          

          【讨论】:

          • 很高兴看到执行此操作所需的一些数学运算。虽然我更喜欢使用内置函数。没有必要重新发明轮子。
          • 对不起,但是round(),正如它所说,是对数字进行四舍五入,有时我不想四舍五入。
          【解决方案15】:

          round_to_2dp 是用户定义的函数,除非您发布该函数的声明,否则无法进行任何操作。

          不过,我的猜测是:number_format($number, 2);

          【讨论】:

          • 从你的第一段开始,我认为你误解了这个问题。 round_to_2dp($number); 是伪代码; OP 要求有人告诉他用什么替换该表达式。
          【解决方案16】:
          $twoDecNum = sprintf('%0.2f', round($number, 2));
          

          四舍五入正确地舍入数字,如果四舍五入后恰好只有 1 个小数位,sprintf 会将其强制保留 2 个小数位。

          【讨论】:

            【解决方案17】:

            使用roud(yourValue,decimalPoint)number_format(yourValue,decimalPoint);

            number_format() 以字符串形式返回值,类似于 1,234.67。所以在这种情况下,您不能将其用于加法或任何计算。如果您尝试,那么您必须处理 数字格式错误...

            在这种情况下round(121222.299000000,2) 将是更好的选择。 结果将是 121222.29 ...

            【讨论】:

              【解决方案18】:

              如果你想在整个项目中使用两个十进制数字,你可以定义:

              bcscale(2);
              

              那么下面的函数就会产生你想要的结果:

              $myvalue = 10.165445;
              echo bcadd(0, $myvalue);
              // result=10.11
              

              但是如果你不使用bcscale函数,你需要编写如下代码才能得到你想要的结果。

              $myvalue = 10.165445;
              echo bcadd(0, $myvalue, 2);
              // result=10.11
              

              了解更多

              【讨论】:

                【解决方案19】:
                $number = sprintf('%0.2f', $numbers); // 520.89898989 -> 520.89
                

                这会给你小数点后的 2 个数字。

                【讨论】:

                • 不,不会的。我不知道这篇文章是什么时候写的,但如果你用你自己的例子试试,至少在我的机器上 :-) ,它将输出 520.90。意思是,舍入将发生。小心!
                【解决方案20】:

                添加到其他答案,因为 number_format() 默认情况下会添加千位分隔符。

                要删除它,请执行以下操作:

                $number = number_format($number, 2, ".", "");
                

                【讨论】:

                  【解决方案21】:

                  数字不圆

                  $double = '21.188624';
                  echo intval($double) . '.' . substr(end(explode('.', $double)), 0, 2);
                  

                  【讨论】:

                    【解决方案22】:

                    这是strtokstr_pad 的另一个解决方案:

                    $num = 520.00
                    strtok(round($num, 2), '.') . '.' . str_pad(strtok('.'), 2, '0')
                    

                    【讨论】:

                      【解决方案23】:
                      • 选择小数位数
                      • 格式化逗号(,)
                      • 修剪尾随零的选项

                      一劳永逸!

                      function format_number($number,$dec=0,$trim=false){
                        if($trim){
                          $parts = explode(".",(round($number,$dec) * 1));
                          $dec = isset($parts[1]) ? strlen($parts[1]) : 0;
                        }
                        $formatted = number_format($number,$dec); 
                        return $formatted;
                      }
                      

                      例子

                      echo format_number(1234.5,2,true); //returns 1,234.5
                      echo format_number(1234.5,2);      //returns 1,234.50
                      echo format_number(1234.5);        //returns 1,235
                      

                      【讨论】:

                        【解决方案24】:

                        如果你像我一样使用math equation,你可以这样设置:

                        {math equation="x + y" x=4.4444 y=5.0000 format="%.2f"}
                        

                        【讨论】:

                          【解决方案25】:

                          这是我今天遇到的同一个问题,想要对一个数字进行四舍五入并将浮点值返回到给定的小数位,并且它不能是字符串(从 number_format 返回) 答案是

                          echo sprintf('%.' . $decimalPlaces . 'f', round($number, $decimalPlaces));

                          【讨论】:

                            猜你喜欢
                            • 2022-12-05
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            相关资源
                            最近更新 更多