显示2位小数的数字

Ric*_*haw 521 php formatting numbers rounding number-formatting

将PHP字符串舍入到2位小数的正确方法是什么?

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

$formatted_number = round_to_2dp($number);

echo $formatted_number;
Run Code Online (Sandbox Code Playgroud)

输出应该是520.00;

round_to_2dp()功能定义应该如何?

Cod*_*nci 1052

你可以使用number_format():

return number_format((float)$number, 2, '.', '');
Run Code Online (Sandbox Code Playgroud)

例:

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

此函数返回一个字符串.

  • @ÁlvaroG.Vicario`round`在这里没有解决OP的问题.`round("520",2)`返回浮点数`520`,并回显当然不会显示到2位小数.对于OP的目的 - 通过用尾随零填充来显示整数到2位小数 - 你需要一个数字格式化函数,而不是舍入函数. (37认同)
  • round()对于它的可读性和简单性也会更好,但是对于任何关键的事情都要注意它已经知道它是错误的 (3认同)
  • 所有其他答案仅限于带点符号的十进制值.当你需要得到'520,00`而不是'520.00`时,这简直有效. (3认同)
  • 我认为你应该使用 bcadd(0,$yournumber,2) 它会给你完美的结果。 (3认同)

Mar*_*c B 185

或者,

$padded = sprintf('%0.2f', $unpadded); // 520 -> 520.00
Run Code Online (Sandbox Code Playgroud)

  • 那么如果你想要'520,00`怎么办?我猜其他答案在这种情况下效果更好. (2认同)
  • ^没有其他答案不会给int两位小数 (2认同)
  • 你可能想要的其他原因是你不想四舍五入......或者在我的原因中返回的 SQL 浮点数与普通浮点数不同,这是一个 PHP 数学错误 (2认同)
  • 我首先尝试了这个,但输出被转换为字符串,所以你和我必须再次将其返回到浮点数,所以请注意这一点 (2认同)

Som*_*luk 175

使用round()(如果您只期望浮点格式的数字,请使用,否则使用number_format()作为Codemwnci给出的答案):

echo round(520.34345, 2);   // 520.34
echo round(520.3, 2);       // 520.3
echo round(520, 2);         // 520
Run Code Online (Sandbox Code Playgroud)

从手册:

描述:

float round(float $val [, int $precision = 0 [, int $mode = PHP_ROUND_HALF_UP ]]);
Run Code Online (Sandbox Code Playgroud)

返回val指定的舍入值precision(小数点后的位数).精度也可以是负数或零(默认值).

...

示例#1 precision示例

<?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
?>
Run Code Online (Sandbox Code Playgroud)

示例#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
?>
Run Code Online (Sandbox Code Playgroud)

  • 它甚至没有正确回答 OP,但已经获得了超过 100 票! (6认同)
  • @RobSedgwick许多人正在寻找将 3.333333333 之后的剩余部分修剪为 3.33 等的函数。 (4认同)
  • @khuderm`round($ number,2);`不起作用。我要520.00而不是520。不敢相信round默认情况下不会这样做。 (2认同)

Sys*_*X17 32

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

例如

echo round(5.045, 2);    // 5.05

echo round(5.055, 2);    // 5.06
Run Code Online (Sandbox Code Playgroud)

  • 我试过了,但它不起作用 - 它不会添加额外的.00. (8认同)
  • round(520, 2) 返回 520,而不是 @Rich 要求的 520.00 (2认同)
  • PHP 7.4+ 的更新,因为这个答案非常旧。由于 round 返回浮点数,因此只能保证返回最多保留一位小数的数字(即,它返回非整数的值,并以可能表示该数字的最小小数位数)。因此“round(1,2)”(或任何级别或精度)返回“*1.0*”,因为“1.00”不是有效的浮点数。要使数字表现得像字符串,您需要使用字符串操作函数。(以前版本的 PHP 可能表现不同/不太符合逻辑) (2认同)

小智 24

尝试:

$number = 1234545454; 
echo  $english_format_number = number_format($number, 2); 
Run Code Online (Sandbox Code Playgroud)

输出将是:

1,234,545,454.00
Run Code Online (Sandbox Code Playgroud)

  • 这有效,但输出将是一个字符串而不是一个数字。 (3认同)
  • 如果你想使用 number_format 至少让它 number_format($number, 2, '.', '') (2认同)

pan*_*kaj 21

使用round(yourValue,decimalPoint)php 手册\xe2\x80\x99s 页面)或number_format(yourValue,decimalPoint);

\n

number_format()以字符串形式返回值,例如1,234.67类型。因此在这种情况下您不能使用它进行加法或任何计算。如果你尝试那么你必须处理数字格式错误......

\n

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

\n


Adi*_*att 14

你可以使用php printfsprintf函数:

示例sprintf:

$num = 2.12;
echo sprintf("%.3f", $num);
Run Code Online (Sandbox Code Playgroud)

没有echo那么你可以运行相同的,sprintf("%.3f", $num);

输出:

2.120
Run Code Online (Sandbox Code Playgroud)

或者,用printf:

echo printf("%.2f", $num);
Run Code Online (Sandbox Code Playgroud)

输出:

2.124
Run Code Online (Sandbox Code Playgroud)


pow*_*tac 12

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

$formatted_number = bcadd($number, 0, 2);
Run Code Online (Sandbox Code Playgroud)

  • 注意,`bc *`函数不会四舍五入,它们总是四舍五入。例如,`bcadd(“ 1.0999”,“ 0.0”,1)`产生“ 1.0”,而不是“ 1.1”。 (2认同)
  • BC Math 函数实际上只是在“$scale”小数位处停止处理。这等于向零舍入。 (2认同)

San*_*mal 11

使用PHP number_format()函数.例如

$num = 7234545423;
echo number_format($num, 2);
Run Code Online (Sandbox Code Playgroud)

输出将是:

7,234,545,423.00


Sha*_*fiz 9

使用PHP number_format()函数.


Mr.*_* HK 9

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

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;
}
Run Code Online (Sandbox Code Playgroud)

上述函数的结果:

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
Run Code Online (Sandbox Code Playgroud)

新的正确答案

使用 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
Run Code Online (Sandbox Code Playgroud)


Iva*_*vić 8

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

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

$number = number_format($number, 2, ".", "");
Run Code Online (Sandbox Code Playgroud)


ajr*_*eal 7

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

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

  • 从你的第一段开始,我认为你误解了这个问题.`round_to_2dp($ number);`的意思是伪代码; OP要求有人告诉他用什么代替表达. (14认同)

Was*_* A. 7

bcdiv($number, 1, 2) // 2 varies for digits after the decimal point
Run Code Online (Sandbox Code Playgroud)

这将在十进制后正好显示两位数.

优点: 如果要仅在浮点值后显示两位数而不是int,则使用此值.


joa*_*lgr 6

我自己做.

$decimals = 2;
$number = 221.12345;
$number = $number * pow(10, $decimals);
$number = intval($number);
$number = $number / pow(10, $decimals);
Run Code Online (Sandbox Code Playgroud)

  • 对不起,但是round(),正如它所说的,轮到数字,有时,我不想轮到。 (2认同)

Vin*_*ney 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    
Run Code Online (Sandbox Code Playgroud)


小智 5

$retailPrice = 5.989;
echo number_format(floor($retailPrice*100)/100,2, '.', ''); 
Run Code Online (Sandbox Code Playgroud)

如果没有舍入数字,它将返回5.98.


小智 5

$number = sprintf('%0.2f', $numbers); // 520.89898989 -> 520.89
Run Code Online (Sandbox Code Playgroud)

这将在小数点后给你2个数字.

  • 不,不会。我不知道这篇文章是什么时候写的,但如果你用自己的例子尝试一下,至少在我的机器上:-),它将输出 520.90。意思是,将会发生舍入。当心! (4认同)

小智 5

$twoDecNum = sprintf('%0.2f', round($number, 2));
Run Code Online (Sandbox Code Playgroud)

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


jew*_*huq 5

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

bcscale(2);
Run Code Online (Sandbox Code Playgroud)

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

$myvalue = 10.165445;
echo bcadd(0, $myvalue);
// result=10.11
Run Code Online (Sandbox Code Playgroud)

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

$myvalue = 10.165445;
echo bcadd(0, $myvalue, 2);
// result=10.11
Run Code Online (Sandbox Code Playgroud)

了解更多