将 PHP 字符串四舍五入到小数点后两位的正确方法是什么?
$number = "520"; // It's a string from a database
$formatted_number = round_to_2dp($number);
echo $formatted_number;
输出应该是 520.00
;
round_to_2dp()
函数定义应该如何?
round
是一个数学函数,这只是一个格式问题。
您可以使用 number_format():
return number_format((float)$number, 2, '.', '');
例子:
$foo = "105";
echo number_format((float)$foo, 2, '.', ''); // Outputs -> 105.00
该函数返回一个字符串。
使用 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 的四舍五入值返回到指定精度(小数点后的位数)。精度也可以是负数或零(默认)。
...
Example #1 round() 例子 Example #2 mode examples
round($number, 2);
不起作用。我想要 520.00 而不是 520。不敢相信 round 默认情况下不会这样做。
或者,
$padded = sprintf('%0.2f', $unpadded); // 520 -> 520.00
520,00
呢?我想在这种情况下,另一个答案效果更好。
http://php.net/manual/en/function.round.php
例如
echo round(5.045, 2); // 5.05
echo round(5.055, 2); // 5.06
round(1,2)
(或任何级别或精度)返回“1.0”,因为“1.00”不是有效的浮点数。要使数字表现得像字符串,您需要使用字符串操作函数。 (以前版本的 PHP 可能表现不同/不太合乎逻辑)
尝试:
$number = 1234545454;
echo $english_format_number = number_format($number, 2);
输出将是:
1,234,545,454.00
使用 PHP number_format() 函数。
例如,
$num = 7234545423;
echo number_format($num, 2);
输出将是:
7,234,545,423.00
您可以使用 PHP printf
或 sprintf
函数:
sprintf
示例:
$num = 2.12;
echo sprintf("%.3f", $num);
您也可以在没有 echo
的情况下运行相同的程序。示例:sprintf("%.3f", $num);
输出:
2.120
或者,使用 printf
:
echo printf("%.2f", $num);
输出:
2.124
解决此问题的另一种更奇特的方法是将 bcadd()
与 0
的 $right_operand 的虚拟值一起使用。
$formatted_number = bcadd($number, 0, 2);
bc*
函数不会向上取整,它们总是向下取整。例如,bcadd("1.0999","0.0",1)
产生“1.0”,而不是“1.1”。
$scale
小数位停止处理。这等于向零舍入。
bcdiv($number, 1, 2) // 2 varies for digits after the decimal point
这将在小数点后精确显示两位数。
优势:
如果您只想在浮点值之后显示两位而不是 int,请使用它。
$retailPrice = 5.989;
echo number_format(floor($retailPrice*100)/100,2, '.', '');
它将返回 5.98 而不对数字进行四舍五入。
floor($retailPrice * 100) / 100;
的工作,然后不需要数字格式。
对于条件四舍五入,即。在真正需要的地方显示小数,否则为整数
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
在这里,我使用函数在 .
(点)之后得到两位小数......
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
我自己做。
$decimals = 2;
$number = 221.12345;
$number = $number * pow(10, $decimals);
$number = intval($number);
$number = $number / pow(10, $decimals);
使用 roud(yourValue,decimalPoint)
或 number_format(yourValue,decimalPoint);
number_format()
以字符串形式返回值,例如 1,234.67。因此在这种情况下,您不能将其用于加法或任何计算。如果您尝试,那么您必须处理 数字格式错误...
在这种情况下,round(121222.299000000,2)
将是更好的选择。结果将是 121222.29 ...
round_to_2dp
是用户定义的函数,除非您发布该函数的声明,否则无法进行任何操作。
但是,我的猜测是这样做:number_format($number, 2);
round_to_2dp($number);
是伪代码; OP 要求有人告诉他用什么替换该表达式。
$twoDecNum = sprintf('%0.2f', round($number, 2));
舍入正确地舍入数字,如果舍入后恰好只有 1 个小数位,则 sprintf 将其强制为 2 个小数位。
$number = sprintf('%0.2f', $numbers); // 520.89898989 -> 520.89
这将为您提供小数点后的 2 个数字。
如果您想在整个项目中使用两位十进制数字,您可以定义:
bcscale(2);
然后以下函数将产生您想要的结果:
$myvalue = 10.165445;
echo bcadd(0, $myvalue);
// result=10.11
但是如果你不使用 bcscale 函数,你需要编写如下代码才能得到你想要的结果。
$myvalue = 10.165445;
echo bcadd(0, $myvalue, 2);
// result=10.11
了解更多
BC 数学函数
比例尺
添加到其他答案,因为 number_format() 默认情况下会添加千位分隔符。
要删除它,请执行以下操作:
$number = number_format($number, 2, ".", "");
无圆数
$double = '21.188624';
echo intval($double) . '.' . substr(end(explode('.', $double)), 0, 2);
选择小数位数
格式化逗号(,)
修剪尾随零的选项
一劳永逸!
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
如果您像我一样使用 math equation
,您可以这样设置:
{math equation="x + y" x=4.4444 y=5.0000 format="%.2f"}
这就是我今天遇到的同一个问题,想要对一个数字进行四舍五入并将浮点值返回到给定的小数位,并且它不能是字符串(从 number_format 返回)答案是
echo sprintf('%.' . $decimalPlaces . 'f', round($number, $decimalPlaces));
echo sprintf()
是一种反模式。它只写成 printf()
更明智。
round
在这里没有解决 OP 的问题。round("520", 2)
返回浮点数520
,并且回显它当然不会显示到小数点后 2 位。对于 OP 的目的 - 通过用尾随零填充来显示整数到小数点后 2 位 - 您需要一个数字格式化函数,而不是舍入函数。520,00
而不是520.00
时,这很有效。