Show a number to two decimal places
将PHP字符串四舍五入到小数点后两位的正确方法是什么?
1 2 3 4 5
| $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():
例:
1 2
| $foo ="105";
echo number_format((float )$foo, 2, '.', ''); // Outputs -> 105.00 |
该函数返回一个字符串。
-
round()的可读性和简单性也将更好,但是对于任何关键的事情,请注意它已经被发现存在bug
-
@ lvaroG.Vicario round不能解决此处的OP问题。 round("520", 2)返回浮点数520,并且回显当然不会显示到小数点后两位。出于OP的目的-通过用尾随的零填充来将整数显示为2个小数位,您需要数字格式设置功能,而不是舍入功能。
-
所有其他答案均限于带点符号的十进制值。当您需要获取520,00而不是520.00时,这很简单。
-
如果只想限制float而不限制int,那么bcdiv(??$ number,1,2)
-
我不认为是否是因为我使用的是php 7.1.0,但是在我的情况下,浮法转换似乎毫无用处,添加或删除对最终结果没有任何影响。
-
我认为您应该使用bcadd(0,$ yournumber,2)它会给您完美的结果。
-
如果value是1.255,然后我们将其转换为1.26,但如果要从1.255获得1.25,该怎么办。请让我知道任何技巧。
-
@BhavinThummar您可以在模式PHP_ROUND_HALF_DOWN中使用round(),如显示Somnaths的回答。如果要舍入并始终保持2dp,则可以混合使用此答案和Somnaths首先进行舍入,然后使用number_format确保以正确的方式输出。
-
如果您想避免取整值并将数字保持在小数点后2位,则可以正常使用floor($number * 100) 100;
或者,
1
| $padded = sprintf('%0.2f', $unpadded); // 520 -> 520.00 |
-
那么,如果您想要520,00怎么办?我猜在这种情况下,其他答案会更好。
-
^不,其他答案不会为整数提供两位小数
-
其他可能需要的原因是您不希望舍入...或者由于我的原因,返回的SQL浮点数与普通浮点数的处理方式不同,这是一个PHP数学错误
使用round()(如果仅希望使用浮点格式的数字,请使用此代码,否则,请使用number_format()作为Codemwnci给出的答案):
1 2 3
| echo round(520.34345,2); // 520.34
echo round(520, 2); // 520 |
从手册中:
Description:
1
| float round(float $val [, int $precision = 0 [, int $mode = PHP_ROUND_HALF_UP ]]); |
Returns the rounded value of val to specified precision (number of digits after the decimal point). precision can also be negative or zero (default).
...
Example #1 round() examples
1 2 3 4 5 6 7 8 9 10
| <?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 mode examples
1 2 3 4 5 6 7 8 9 10 11
| <?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默认情况下不会这样做。
http://php.net/manual/en/function.round.php
例如
1 2 3
| echo round(5.045, 2); // 5.05
echo round(5.055, 2); // 5.06 |
-
Round将执行Rich想要的确切功能,但是number_format()对于各种数字格式的查找将更加有趣。
-
此方法将执行舍入运算,而不仅仅是在最后强制数字" .00"。
-
id尝试了一下,但是没有用-不会添加额外的.00。
-
尝试使用其中一个示例,在PHP脚本中单独使用它。您应该得到评论结果。如果不是,那么您的PHP设置在某处有问题。
-
round(520,2)返回520,而不是@Rich要求的520.00
尝试:
1 2
| $number = 1234545454;
echo $english_format_number = number_format($number, 2); |
输出将是:
-
那行得通,但是输出将是字符串而不是数字。
-
只需在number_format之前添加+。
-
如果要使用number_format至少使其成为number_format($ number,2,。,)
您可以使用PHP printf或sprintf函数:
sprintf的示例:
1 2
| $num = 2.12;
echo sprintf("%.3f", $num); |
您也可以在没有echo的情况下运行相同的代码。示例:sprintf("%.3f", $num);
输出:
或者,使用printf:
输出:
解决此问题的另一种更奇特的方法是使用bcadd()和0的$ right_operand虚拟值。
1
| $formatted_number = bcadd($number, 0, 2); |
-
请注意,bc*函数不会舍入,而是始终舍入。例如,bcadd("1.0999","0.0",1)产生的是" 1.0",而不是" 1.1"。
-
BC Math函数实际上只是停止处理$scale小数位数。这等于四舍五入。
使用PHP number_format()函数。
例如,
输出将是:
使用PHP number_format()函数。
round_to_2dp是用户定义的函数,除非发布了该函数的声明,否则将无法执行任何操作。
但是,我的猜测是这样做的:number_format($number, 2);
-
在您的第一段中,我认为您误解了这个问题。 round_to_2dp($number);是伪代码; OP要求有人告诉他用该表达替换什么。
1
| bcdiv($number, 1, 2) // 2 varies for digits after the decimal point |
这将在小数点后精确显示两位数。
优点:
如果只想在浮点数后显示两位数而不是int,请使用此位。
-
如果您拥有bcdiv(??它是现货,但不是centos6上的默认软件包),这是最通用的解决方案。
对于有条件的舍入即。在真正需要的地方显示小数,否则为整数
123.56 => 12.56
123.00 => 123
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| $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 |
我自己做。
1 2 3 4 5
| $decimals = 2;
$number = 221.12345;
$number = $number * pow(10, $decimals);
$number = intval($number);
$number = $number / pow(10, $decimals); |
-
很高兴看到执行此操作所需的一些数学运算。尽管我首选使用内置函数。没有必要重新发明轮子。
-
抱歉,但是round()就像上面所说的那样,按数字四舍五入,有时我不想四舍五入。
它将返回5.98,而不四舍五入数字。
-
只有这样,才可以执行工作floor($retailPrice * 100) 100;,而无需数字格式。
1
| $number = sprintf('%0.2f', $numbers); // 520.89898989 -> 520.89 |
小数点后将为您提供2个数字。
-
不,不会。我不知道这个帖子是什么时候写的,但是如果您用自己的示例尝试它,至少在我的机器上:-),它将输出520.90。意思是,将发生舍入。小心!
如果四舍五入后恰好只有1个小数位,则四舍五入会正确舍入该数字,并且sprintf将其强制小数点后两位。
在这里,我使用函数在.(点)后得到两个小数。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| 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;
} |
以上功能的结果:
1 2 3 4 5 6 7
| 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
1 2 3 4 5 6
| 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 |
如果要在整个项目中使用两位十进制数字,则可以定义:
然后,以下函数将产生您想要的结果:
1 2 3
| $myvalue = 10.165445;
echo bcadd(0, $myvalue);
// result=10.11 |
但是,如果您不使用bcscale函数,则需要按如下所示编写代码以获得所需的结果。
1 2 3
| $myvalue = 10.165445;
echo bcadd(0, $myvalue, 2);
// result=10.11 |
了解更多
不带轮数
这是使用strtok和str_pad的另一个解决方案:
您可以使用PHP round()函数。
1 2 3 4 5 6 7 8
| 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 |
-
-1;这个答案没有增加Somnath Muluks答案早在两年前就已经包含的新内容。
-
正如我对Somnaths答案的评论中所指出的,它也是错误的。