侧边栏壁纸
博主头像
云BLOG 博主等级

行动起来,活在当下

  • 累计撰写 318 篇文章
  • 累计创建 6 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录
WEB

PHP保留两位小数并且四舍五入

Administrator
2024-06-24 / 0 评论 / 0 点赞 / 1 阅读 / 0 字
小数例子:


PHP保留两位小数并且四舍五入

1
$n=0.1265489;
2
echo sprintf("%.2f", $n); // 0.13
大家可以看到我们用到了sprintf函数对$n进行了格式化%.2f是目标格式,其中2表示两位f表示float(浮点型) 第3为小数6被四舍五入

再看个例子


1
$n=0.1265489
2
echo substr(sprintf("%.3f",$n),0,-1);// 0.12
代码输出了保留2为小数没有四舍五入,实际上我们了解了sprintf的特性会四舍五入小数后我们多保留了一位,然后用substr来截取前2位


取整例子:


1
echo ceil(4.1);    // 5
2
echo ceil(9.999);  // 10
ceil函数是向上取整函数,什么叫向上呢? 就是说如果超出一点点那就向前进一位如例子中4.1就变成了5。

跟它相反还有一个函数叫floor我们看看它的用法


1
echo floor(4.1);   // 4
2
echo floor(9.999); // 9
floor的特性在第二个输出中显的特别明显,那就是不给你多少位小数哪怕是无限接近10也没有用向下取到的整数就是9。

round函数


01
<?PHP
02
  echo round(3.4);         // 3
03
  echo round(3.5);         // 4
04
  echo round(3.6);         // 4
05
  echo round(3.6, 0);      // 4
06
  echo round(1.95583, 2);  // 1.96
07
  echo round(1241757, -3); // 1242000
08
  echo round(5.045, 2);    // 5.05
09
  echo round(5.055, 2);    // 5.06
10
?>

round函数在PHP手册中的说明是:

float round ( float $val [, int $precision = 0 [, int $mode = PHP_ROUND_HALF_UP ]] )

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

round 的参数一是数据源,参数二是要保留的小数位而且之后一位(比如你输入2那么第3为是之后一位)被四舍五入,当他是负数的时候,从数据源最后一位开始往前数相应的长度制0并将最后一位四舍五入比如round(123456,-2) 就是123456从6开始往前数两位都变成零,并且最后一位5(从后往前数第一位是6最后一位是5)被四舍五入,输出123500

PHP如何保留小数点后几位
1. round()

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

// 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()函数向下舍入为最接近的整数

2. 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"

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

//   bcadd(被加数, 加数, 保留几位小数);
 bcadd( 9.9999999999,  0,  8); //  "9.99999999"
 bcadd(9.9999999999, 1, 8);  // "10.99999999"

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

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

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

详细请点击查看 菜鸟教程 对sprintf()的解析

替代小数方案:

其实我们可以完全可以使用整数来当做小数处理,比如金额:
¥100.9 我们存入数据库可以存入10000,取出来的时候 除以100即可,这样会避免掉一些小数对我们实际代码中的问题。

扩展PHP 的 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 :前面的数大于后面的数

0

评论区