您的位置:首页 > 编程语言 > PHP开发

php数字运算与格式化

2020-10-30 13:56 281 查看

浮点数高精度运算

PHP 官方手册

浮点数的精度有限。尽管取决于系统,PHP 通常使用 IEEE 754 双精度格式,则由于取整而导致的最大相对误差为 1.11e-16。非基本数学运算可能会给出更大误差,并且要考虑到进行复合运算时的误差传递。
此外,以十进制能够精确表示的有理数如 0.1 或 0.7,无论有多少尾数都不能被内部所使用的二进制精确表示,因此不能在不丢失一点点精度的情况下转换为二进制的格式。这就会造成混乱的结果:例如,floor((0.1+0.7)*10) 通常会返回 7 而不是预期中的 8,因为该结果内部的表示其实是类似 7.9999999999999991118...。
所以永远不要相信浮点数结果精确到了最后一位,也永远不要比较两个浮点数是否相等。如果确实需要更高的精度,应该使用任意精度数学函数或者 gmp 函数

鉴于以上语言本身的特性,浮点数运算时可能会出现偏差,尤其是运算结果转换成整数时.

echo intval((0.1+0.7) * 10); //输出: 7

所以在处理此类计算是需要使用任意精度数学函数(BCMath),自 PHP 4.0.4,libbcmath 随同 PHP 一起发布,该扩展不需要任何外部的库.

  • bcadd — 2个任意精度数字的加法计算
  • bccomp — 比较两个任意精度的数字
  • bcdiv — 2个任意精度的数字除法计算
  • bcmod — 对一个任意精度数字取模
  • bcmul — 2个任意精度数字乘法计算
  • bcpow — 任意精度数字的乘方
  • bcpowmod — 将任意精度数提高到另一个,以指定的模数减少
  • bcscale — 设置所有bc数学函数的默认小数点保留位数
  • bcsqrt — 任意精度数字的二次方根
  • bcsub — 2个任意精度数字的减法

数字格式化

$num = 1234.5678

保留两位小数,四舍五入:
echo sprintf("%0.2f", $num); //输出: 1234.57
echo number_format($num, 2, '.', ''); //输出: 1234.57

注意: number_format默认不保留小数,且会加千位符", "

$num = number_format($num);
echo $num; //输出: 1,234
echo intval($num); //输出: 1
不含小数的10位数,不足前面加0补足:
$num = sprintf("%010d", $num);//生成10位数,不足前面补0
echo $num;//输出结果: 0000001234

原文地址: https://www.zhuyilong.fun/tech/the-blog-phpnumber.html

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: