PHP 保留小数点后几位


PHP 保留小数点后几位


正文

碰到支付金额等计算,需要精确到小数点后2位,可用的方法用哪些?

这里大概记录下,并拓展。

round

float round ( float val [, int precision] )

返回将 val 根据指定精度 precision(十进制小数点后数字的数目)进行四舍五入的结果。precision 也可以是负数或零(默认值)。

该函数可以按照指定的小数位数进行 四舍五入 运算的结果(并不会严格按指定位数输出)。除数值外,也可对日期进行舍入运算。

返回的是 float 类型

代码如下:

<?php
// round(要舍入的数, 规定小数点后的尾数可以为负数, 舍入模式的常量); 

round(100.78888888888, 8);   //  100.78888889
round(100.899999999999, 8);  //  100.9

round(1985.87, -1);  //  1990.0

//默认,遇到5向上取整
round(100.555, 2, PHP_ROUND_HALF_UP);  //  100.56
//遇到5向下取整,
round(100.555, 2, PHP_ROUND_HALF_DOWN);  //  100.55


// ceil()函数向上舍入为最接近的整数
// floor()函数向下舍入为最接近的整数

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

number_format

该函数作用是对数字进行格式化可以按照指定小数位数输出,会对结果进行 四舍五入 运算。

返回的是string 类型

//   number_format(要格式化的数字, 保留几位小数, 规定用作小数点的字符串,千位分隔符的字符串);
number_format(100.78888888888, 8);  //  "100.78888889"
number_format(100.899999999999, 8);  // "100.90000000"
number_format(10000000.7888888, 5, '*', '/');  // "10/000/000*78889"

bcadd

该函数用于价格累加,可以返回指定指定小数位数输出。值得一提的是,函数 不会 对结果进行 四舍五入 运算。

返回的是string 类型

//  bcadd(被加数, 加数, 保留几位小数);
bcadd(9.9999999999, 0, 3); //  "9.999"
bcadd(9.9999999999, 1, 3);  // "10.999"

sprintf

sprintf() 函数的主要功能是把百分号(%)符号替换成一个作为参数进行传递的变量. 我们也可以用sprintf() 函数对小数格式化,它会对结果进行 四舍五入 运算。

返回的也是字符串

<?php
//  sprintf(规定字符串以及如何格式化其中的变量, 规定插到 format 字符串中第一个 % 符号处的参数);
//保留2位小数
sprintf("%.2f",100.999999);  // "101.00"

//替换
$number = 10;
$str = "CS";
$txt = sprintf("%s今天有%u万的访问量", $str, $number);  // "CS今天有10万的访问量"

$number = 123213.066666;
echo sprintf("%.2f", $number);  // 123213.07

php保留三位小数并且四舍五入

<?php
$num=0.0215489;
echo sprintf("%.3f", $num); // 0.022

保留三位小数不四舍五入

<?php
$num=0.0215489;
echo substr(sprintf("%.4f", $num),0,-1); // 0.021

拓展

bcmath

//bcsub(被减数,减数,保留几位小数); 
bcsub(99.99, 11.11, 2); //  "88.88"

//bcmul(被乘数,乘数,保留几位小数); 
bcmul(11.11, 11.11, 2); // "123.43"

//bcdiv(被除数,除数,保留几位小数); 
bcdiv(100, 3, 2); // "33.33"

//bcpow(数字,次方,保留几位小数);
bcpow(2.1,3, 2); // "9.26"

//bcsqrt(被开方数,保留几位小数);  此函数开平方
bcsqrt( 3,  5)  // "1.73205"


//bccomp — 比较两个任意精度的数字
bccomp('1','2');    // -1
bccomp('1.00001','1' ,3);  // 0
bccomp('1.00001','1',5);  // 1

ceil

float ceil ( float value )

返回不小于 value 的下一个整数,value 如果有小数部分则进一位。ceil() 返回的类型仍然是 float,因为 float 值的范围通常比 integer 要大。

代码如下:

<?php
echo ceil(4.3); // 5
echo ceil(9.999); // 10

floor

floor ( float value )

返回不大于 value 的下一个整数,将 value 的小数部分舍去取整。floor() 返回的类型仍然是 float,因为 float 值的范围通常比 integer 要大。

代码如下:

<?php
echo floor(4.3); // 4
echo floor(9.999); // 9

intval

对变数转成整数型态,不会 对结果进行 四舍五入 运算。

代码如下:

<?php
echo intval(4.3);  // 4
echo intval(4.6);  // 4

参考资料

PHP如何保留小数点后几位 https://www.pythonf.cn/read/95140

PHP四舍五入精确小数位及取整 https://mp.weixin.qq.com/s/QM5s3ZJ-atPLUlziaMnhvg

PHP 小数运算(取整、四舍五入、算术运算等) https://ibaiyang.github.io/blog/php/2017/05/10/PHP-小数运算-取整-四舍五入-算术运算等.html


返回