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 — 将两个高精度数字相减

  • 相关阅读:
    在Idea中使用Eclipse编译器
    Idea切换svn分支,类似Eclipse的Switch功能
    Spring AOP详解
    CGLib动态代理原理及实现
    IDEA下搜狗输入法输入中文时卡着不动的参考解决方法
    Nginx反向代理丢失cookie的问题
    redis连接池自动释放
    Redis常用命令
    waitpid之status意义解析
    bash中管道命令返回值如何确定(下)
  • 原文地址:https://www.cnblogs.com/caibaotimes/p/14199361.html
Copyright © 2011-2022 走看看