zoukankan      html  css  js  c++  java
  • php计算时 出现Warning: A non-numeric value encountered问题的原因及解决方法

    在使用(+ - * / ** % << >> | & ^) 运算时,例如a+b,如果a是开始一个数字值,但包含非数字字符(123a),b不是数字值开始时(b456),就会有A non-numeric value encountered警告。

    对于这种问题,首先应该在代码逻辑查看,为何会出现混合数值,检查哪里出错导致出现混合数值。

    对于(+ - * / ** % << >> | & ^) 的运算,我们也可以加入转换类型方法,把错误的数值转换。

    加入intval方法进行强制转为数值型后,可以解决警告提示问题。

    如果用php的+-/计算浮点数的时候,可能会遇到一些计算结果错误的问题,比如echo intval( 0.58100 );会打印57,而不是58,这个其实是计算机底层二进制无法精确表示浮点数的一个bug,是跨语言的,我用python也遇到这个问题。所以基本上大部分语言都提供了精准计算的类库或函数库,比如php有BC高精确度函数库

    <?php    $f = 0.58;    var_dump(intval($f * 100)); //为啥输出57?>
    

    永远不要相信浮点数结果精确到了最后一位,也永远不要比较两个浮点数是否相等。如果确实需要更高的精度,应该使用任意精度数学函数或者 gmp 函数

    <?php
    
    $a = 0.1;
    $b = 0.7;
    var_dump(bcadd($a,$b,2) == 0.8);
    

    bcadd — 将两个高精度数字相加

    bccomp — 比较两个高精度数字,返回-1, 0, 1

      bcdiv — 将两个高精度数字相除

      bcmod — 求高精度数字余数

      bcmul — 将两个高精度数字相乘

      bcpow — 求高精度数字乘方

      bcpowmod — 求高精度数字乘方求模,数论里非常常用

      bcscale — 配置默认小数点位数,相当于就是Linux bc中的”scale=”

      bcsqrt — 求高精度数字平方根

      bcsub — 将两个高精度数字相减

  • 相关阅读:
    常见RGB透明度对照表在这
    Android节假日图标动态替换方案
    用两个栈实现队列
    从头到尾打印链表 (链表/栈)
    MySQL常用函数
    找出数组中重复的数字
    两数之和
    java的list的几种排序写法整理(sort的用法)
    Java知识目录
    通过关键词来推荐话题
  • 原文地址:https://www.cnblogs.com/caibaotimes/p/14199361.html
Copyright © 2011-2022 走看看