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 — 將兩個高精度數字相減
總結
以上是生活随笔為你收集整理的php计算时 出现Warning: A non-numeric value encountered问题的原因及解决方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 百度搜索框智能提示功能代码
- 下一篇: BLOB 操作