加入收藏 | 设为首页 | 会员中心 | 我要投稿 源码门户网 (https://www.92codes.com/)- 云服务器、云原生、边缘计算、云计算、混合云存储!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php浮点数精度值案例程序详解

发布时间:2023-10-26 12:07:33 所属栏目:PHP教程 来源:网络
导读:

  php中浮点数的精度值是用来控制输出该浮点数时使用的,可以理解为控制输出的位数,精度值不同,看到输出结果也可能不一样,注意:其内部还是按照实际值存储的,当两个浮点数进行四则

  php中浮点数的精度值是用来控制输出该浮点数时使用的,可以理解为控制输出的位数,精度值不同,看到输出结果也可能不一样,注意:其内部还是按照实际值存储的,当两个浮点数进行四则运算时,用的还是其本来的值。
 
  php的配置文件中使用precision来设定全局指定浮点数的精度值,似乎每个发行版,它的默认设置都不太一样,我在window下看到是12,在linux下看到此值是14,当然也可以通过程序中使用ini_set来改变全局设置,例如:
 
   代码如下
 
  1  ini_set("precision", "15");
 
  对于精度我一直理解为小数点后保留多少,那么在php的浮点数中是这样的么?答案是否定的。
 
  浮点数其实是整数部分和小数部分组成,这里的精度是指整数部分的位数加小数部分的位数不能超过其精度最大值,如果超过,则按照四舍五入的方法截断到最大的精度值。整数部分如果是0,则不计位数,小数部分末尾0也不计入位数。另外对于同一个数,precision的不同,可能显示的出来表现形式也不一样。下面通过例子的方式来说明。
 
  整数部分为 0 情况
 
   代码如下
 
  1 $num = 0.12345600000000000;
 
   //整数部分为0 ,位数为 0 ,小数部分末尾的 0 不计入位数,所以总位数为 6
 
  2  ini_set("precision", "12");
 
   echo $num; // 0.123456
 
   //未超过精度值,显示的结果为 0.123456
 
  3  ini_set("precision", "3");
 
   echo $num; // 0.123
 
   //超过精度值,保留3位
 
  4  ini_set("precision", "5");
 
   echo $num; // 0.12346
 
   //超过精度值,保留5位这种情况下,精度值等价于小数点后保留几位。
 
  整数部分大于 0 情况
 
   代码如下
 
  1  $num = 12.12345600000000000;
 
   //整数部分为12 ,位数为 2 ,小数部分末尾的 0 不计入位数,位数为6,所以总位数为 2 + 6
 
  2  ini_set("precision", "12");
 
   echo $num; // 12.123456
 
   //未超过精度值,显示的结果为 12.123456
 
  3  ini_set("precision", "3");
 
   echo $num; // 12.1
 
   //超过精度值,整数部分位数为 2 ,所以只保留一位小数
 
  4  ini_set("precision", "5");
 
   echo $num; // 12.123
 
   //超过精度值,整数部分位数为 2 ,所以只保留3位小数可以看到小数点后保留的位数跟精度已经整数部分的位数有关
 
  。
 
  整数部分大于 0 情况 之二
 
   代码如下
 
  1  $num = 12345678.12345600000000000;
 
   //整数部分为12345678 ,位数为 8 ,小数部分末尾的 0 不计入位数,位数为6,所以总位数为 8 + 6
 
  2  ini_set("precision", "12");
 
   echo $num; // 12345678.1235
 
   //超过精度值,显示的结果为 12345678.1235
 
  3  ini_set("precision", "3");
 
   echo $num; // 1.23E+7
 
   //超过精度值,且整数部分位数超过精度,小数部分舍弃,且整数部分只取3位
 
  4  ini_set("precision", "5");
 
   echo $num; // 12346000
 
   //超过精度值,且整数部分位数超过精度,小数部分舍弃,且整数部分只取5位上述例子中可以看到,精度值也关系到整数部分的截取。注意到最后两个例子中显示的方式不一样,一个是使用科学计数法,一个是后面用 0 补。通过实验得出的结论是当整数部分的位数 减去 精度值 大于 4 的时候,使用科学计数法的方式,否则后面用 0 补,换句话说,就是整数部分位数超过精度值后,截断后,补 0 的个数不会超过 4 。
 
  浮点数运算
 
   代码如下
 
  1  $num1 = 1331625729.687;
 
   $num2 = 1331625730.934;
 
   ini_set("precision", "8");
 
  2  echo $num1 . '
 
  ';
 
   echo $num2 . '
 
  ';
 
  3  $sub = $num1 - $num2;
 
  4  echo $sub . '
 
  ';
 
  //输出的结果为:
 
  /*
 
   1331625700
 
   1331625700
 
   -1.247
 
  */
 
  上述例子就说明了精度值只是控制显示结果,内部存储还是原始值,所以 $sub 的值为1331625729.687减1331625730.934。
 
  PHP内置的echo, var_dump, json_encode, 字符串拼接等函数(指令)在显示浮点数时都有问题, 导致精度丢失.
 
   代码如下
 
  1   
 
  2    $a = 1315537636.338467;
 
  3    printf("%f", $a); echo "n";
 
  4    echo $a . "n";
 
  5    echo $a; echo "n";
 
  6   ?>
 
  7   结果
 
  8   1315537636.338467
 
  9   1315537636.3385
 
  10   1315537636.3385
 
    也就是说, 用PHP最顺手的方法将浮点数转成字符串或者显示是不行的, 必须使用printf/sprintf将浮点数转成字符串.
 
 

(编辑:源码门户网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章