显示一个数字到小数点后两位


569

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

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

$formatted_number = round_to_2dp($number);

echo $formatted_number;

输出应该是520.00;

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


13
这确实不是“四舍五入”。舍入会降低精度。不会将小数位添加到没有小数位的位置。基于许多答案和评论,似乎人们认为四舍五入不是事实。round是一个数学函数,这只是一个格式问题。
不要惊慌

Answers:


1130

您可以使用number_format()

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

例:

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

该函数返回一个字符串


4
round()也会因为它的可读性和简单性而更好,但是对于任何重要的问题,请注意,它已经被发现是越野车
StringsOnFire 2014年

40
@ÁlvaroG.Vicario round不能在此处解决OP的问题。round("520", 2)返回float 520,并且回显当然不会将其显示到小数点后两位。出于OP的目的-通过用尾随的零填充来显示整数到小数点后2位-您需要数字格式化功能,而不是舍入功能。
Mark Amery 2014年

3
所有其他答案都限于带点符号的十进制值。当您需要获取520,00而不是时520.00,这很简单。
SPRBRN 2014年

1
如果您只想限制浮点数而不限制int,则bcdiv(​​$ number,1,2)
Wasim A.

2
我认为您应该使用bcadd(0,$ yournumber,2),它将给您完美的结果。
jewelhuq '18年

213

使用round()(如果只希望以浮点格式使用数字,则使用;否则,使用number_format()作为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也可以是负数或零(默认值)。

...

Example#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
?>

Example#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
?>

5
@khuderm round($number, 2);不起作用。我要520.00而不是520。不敢相信round默认情况下不会这样做。
Claudiu Creanga '16

2
它甚至不能正确回答OP,但有100票以上的票数!
罗伯·塞奇威克

200

或者,

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

3
那你想520,00怎么办呢?我猜在这种情况下,其他答案会更好。
SPRBRN 2014年

2
^不,其他答案不会为整数提供两位小数
pythonian29033

1
您可能想要的其他原因是您不希望舍入...或者由于我的原因,返回的SQL浮点数与普通的浮点数不一样,这是一个PHP数学错误
Amb3rL4nn

34

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

例如

echo round(5.045, 2);    // 5.05

echo round(5.055, 2);    // 5.06

Round将执行Rich想要的确切功能,但是number_format()对于各种数字格式的查找将更加有趣。
Shamim Hafiz 2010年

此方法将执行舍入运算,而不仅仅是在最后强制数字“ .00”。
SystemX17 2010年

10
我试过了,但是不起作用-不会添加额外的.00。
Rich Bradshaw 2010年

尝试使用其中一个示例,它是一个PHP脚本。您应该得到评论结果。如果不是,那么您的PHP设置在某处有问题。
SystemX17 2010年

1
round(520,2)返回520,而不是@Rich要求的520.00
user761100 '18 -10-15

25

尝试:

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

输出将是:

1,234,545,454.00

2
那行得通,但是输出将是字符串而不是数字。
伊桑(Ethan)

1
如果要使用number_format至少使其成为number_format($ number,2,'。','')
Mihai P.

14

您可以使用PHP printfsprintf函数:

范例sprintf

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

您也可以运行相同的内容echo。例:sprintf("%.3f", $num);

输出:

2.120

或者,使用printf

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

输出:

2.124

12

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

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

2
请注意,bc*函数不舍入,而是始终舍入。例如,bcadd("1.0999","0.0",1)产生“ 1.0”,而不是“ 1.1”。
ColinM '18年

1
BC Math函数实际上只是停止$scale小数位数的处理。这等于四舍五入。
阿里(Ali)



7

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

但是,我的猜测是这样做的: number_format($number, 2);


14
从第一段开始,我认为您误解了这个问题。round_to_2dp($number);被当作​​伪代码;OP要求有人告诉他用该表达替换什么。
Mark Amery 2013年

7
bcdiv($number, 1, 2) // 2 varies for digits after the decimal point

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

优点:

如果只想在浮点数后面显示两位数而不是int,请使用此位。


如果您有bcdiv(​​这是现货,但不是centos6上的默认软件包),这是最通用的解决方案。
Shovas

6
$twoDecNum = sprintf('%0.2f', round($number, 2));

如果四舍五入后恰好只有1个小数位,则四舍五入正确地将数字四舍五入,并且sprintf将其强制小数点后两位。


6
$retailPrice = 5.989;
echo number_format(floor($retailPrice*100)/100,2, '.', ''); 

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


这样只有这样也可以完成floor($retailPrice * 100) / 100;不需要数字格式的工作。
somsgod

6

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

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    

6

我自己做。

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

1
很高兴看到执行此操作所需的一些数学运算。尽管我首选使用内置函数。没有必要重新发明轮子。
Lightbulb1 2013年

1
抱歉,但是round()就像上面所说的那样,按数字四舍五入,有时,我不想四舍五入。
joanlgr 2013年

5

在这里,我.使用函数在(点)后得到两个小数。

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

4
$number = sprintf('%0.2f', $numbers); // 520.89898989 -> 520.89

小数点后将为您提供2个数字。


4
不,不会。我不知道这篇文章是什么时候写的,但是如果您使用自己的示例尝试它,至少在我的机器上:-),它将输出520.90。意思是,将发生舍入。小心!
Boaz Rymland '16

4

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

bcscale(2);

然后,以下函数将产生您想要的结果:

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

但是,如果您不使用bcscale函数,则需要按如下所示编写代码以获得所需的结果。

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

了解更多



1

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

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


0
  • 选择小数位数
  • 格式化逗号(,)
  • 修剪尾随零的选项

一劳永逸!

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

-5

您可以使用PHP round()函数。

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

3
-1; 这个答案没有增加任何新东西,而Somnath Muluk的答案早在两年前还没有。
Mark Amery 2014年

1
正如我对Somnath答案的评论所指出的那样,这也是错误的。
Mark Amery 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.