首页技术php四舍五入?为什么php用小数点相减不对呢

php四舍五入?为什么php用小数点相减不对呢

编程之家 2023-11-01 214次浏览

大家好,如果您还对php四舍五入不太了解,没有关系,今天就由本站为大家分享php四舍五入的知识,包括为什么php用小数点相减不对呢的问题都会给大家分析到,还望可以解决大家的问题,下面我们就开始吧!

php四舍五入?为什么php用小数点相减不对呢

php round怎么用啊!

1、数据库中的round()

Round函数返回一个数值,该数值是按照指定的小数位数进行四舍五入运算的结果。除数值外,也可对日期进行舍入运算。

2、Excel中的round()

round函数是EXCEL中的一个基本函数,作用按指定的位数对数值进行四舍五入,语法是ROUND(number, num_digits)。

3、PHP中的round()

round(x,prec),x:可选,规定要舍入的数字。prec:可选,规定小数点后的位数。

php四舍五入?为什么php用小数点相减不对呢

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

php除法函数是什么

php除法函数有3个,分别是:1、round函数,用于对浮点数进行四舍五入;2、ceil函数用于向上舍入为最接近的整数;3、floor函数,用于向下舍入为最接近的整数。

推荐:《PHP视频教程》

php中除法取整的方法(round,ceil,floor)

PHP中遇到需要将除法所得结果取整的情况时,就需要用到以下方法:

1. round:四舍五入

php四舍五入?为什么php用小数点相减不对呢

round()函数对浮点数进行四舍五入。

语法:round(x, prec)

参数

x可选。规定要舍入的数字。

prec可选。规定小数点后的位数。

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

提示:PHP默认不能正确处理类似"12,300.2"的字符串。

例:

<?php

echo(round(0.60));

echo(round(0.50));

echo(round(0.49));

echo(round(-4.40));

echo(round(-4.60));

?>输出:

1

1

0

-4

-52. ceil:向上取整

ceil()函数向上舍入为最接近的整数。

语法:ceil(x)

参数

x必须。规定要舍入的数字。

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

例:

<?php

echo(ceil(0.60);

echo(ceil(0.40);

echo(ceil(5);

echo(ceil(5.1);

echo(ceil(-5.1);

echo(ceil(-5.9));

?>输出:

1

1

5

6

-5

-53. floor:向下取整

floor()函数向下舍入为最接近的整数。

语法:floor(x)

参数

x必须。规定要舍入的数字。

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

例:

<?php

echo(floor(0.60));

echo(floor(0.40));

echo(floor(5));

echo(floor(5.1));

echo(floor(-5.1));

echo(floor(-5.9))

?>输出:

0

0

5

5

-6

-6

为什么php用小数点相减不对呢

一则浮点数计算例子如下:

代码如下:

$a= 0.2+0.7;

$b= 0.9;

var_dump($a==$b);

打印出的结果是:bool(false)。也就是说在这里 0.2+0.7的计算结果与 0.9并不相等,这显然是有违我们的常识的。

对此问题,PHP官方手册曾又说明:显然简单的十进制分数如 0.2不能在不丢失一点点精度的情况下转换为内部二进制的格式。这和一个事实有关,那就是不可能精确的用有限位数表达某些十进制分数。例如,十进制的 1/3变成了 0.3333333...。

我们将上面的变量用双精度格式打印出来:

代码如下:

$a= 0.2+0.7;

$b= 0.9;

printf("%0.20f",$a);

echo'<br/>';

printf("%0.20f",$b);

输出结果如下:

代码如下:

0.89999999999999991118

0.90000000000000002220

显然在这里,实际上作为浮点型数据,其精度已经损失了一部分,达不到完全精确。所以永远不要相信浮点数结果精确到了最后一位,也永远不要比较两个浮点数是否相等。需要说明的是,这不是PHP的问题,而是计算机内部处理浮点数的问题!在 C、JAVA等语言中也会遇到同样的问题。

所以要比较两个浮点数,需要将其控制在我们需要的精度范围内再行比较,因此使用 bcadd()函数来对浮点数想加并进行精度转换(为字符串):

代码如下:

var_dump(bcadd(0.2,0.7,1)== 0.9);//输出:bool(true)

浮点数取整

在《PHP取整函数 ceil与 floor》一文中,曾有例子:

代码如下:

<?php

echo ceil(2.1/0.7);//输出:4

?>

经过上面对浮点数计算的探讨,知道这是浮点数计算结果不完全精确造成的:

代码如下:

<?php

printf("%0.20f",(2.1/0.7));//输出:3.00000000000000044409

?>

经过上面对浮点数计算的探讨,知道这是浮点数计算结果不完全精确造成的,因此使用 round()函数处理一下即可:

代码如下:

<?php

echo ceil( round((2.1/0.7),1));

?>

虽然 round()函数是按照指定的精度进行四舍五入,但保留小数点后一位,对我们的取整结果是没影响的。

关于本次php四舍五入和为什么php用小数点相减不对呢的问题分享到这里就结束了,如果解决了您的问题,我们非常高兴。

microsoft sql server(Microsoft SQL Server可不可以删) 上网站建设?网站建设的作用有哪些