最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

php 浮點數(shù)比較方法詳解

 更新時間:2017年05月05日 10:59:37   作者:傲雪星楓  
本篇文章主要介紹了php浮點數(shù)比較方法,具有很好的參考價值。下面跟著小編一起來看下吧

浮點數(shù)運(yùn)算精度問題

首先看一個例子:

<?php
$a = 0.1;
$b = 0.9;
$c = 1;
var_dump(($a+$b)==$c);
var_dump(($c-$b)==$a);
?>

$a+$b==$c 返回true,正確
$c-$b==$a 返回false,錯誤

為什么會這樣呢?

運(yùn)算后,精度為20位時實際返回的內(nèi)容如下:

<?php
$a = 0.1;
$b = 0.9;
$c = 1;
printf("%.20f", $a+$b); // 1.00000000000000000000
printf("%.20f", $c-$b); // 0.09999999999999997780
?>

$c-$b 為 0.09999999999999997780,因此與0.1比較返回false

出現(xiàn)這個問題是因為浮點數(shù)計算涉及精度,當(dāng)浮點數(shù)轉(zhuǎn)為二進(jìn)制時有可能會造成精度丟失。

浮點數(shù)轉(zhuǎn)二進(jìn)制方法

整數(shù)部分采用除以2取余方法

小數(shù)部分采用乘以2取整方法

例如:把數(shù)字8.5轉(zhuǎn)為二進(jìn)制

整數(shù)部分是8

8/2=4 8%2=0
4/2=2 4%2=0
2/2=1 2%2=0

1比2小,因此不需要計算下去,整數(shù)8的二進(jìn)制為 1000

小數(shù)部分是0.5

0.5x2 = 1.0

因取整后小數(shù)部分為0,因此不需要再計算下去

小數(shù)0.5的二進(jìn)制為 0.1

8.5的二進(jìn)制為1000.1

計算數(shù)字0.9的二進(jìn)制

0.9x2=1.8
0.8x2=1.6
0.6x2=1.2
0.2x2=0.4
0.4x2=0.8
0.8x2=1.6

…. 之后不斷循環(huán)下去,當(dāng)截取精度為N時,N后的數(shù)會被舍去,導(dǎo)致精度丟失。

上例中0.9在轉(zhuǎn)為二進(jìn)制時精度丟失,導(dǎo)致比較時出現(xiàn)錯誤。

所以永遠(yuǎn)不要相信浮點數(shù)已精確到最后一位,也永遠(yuǎn)不要比較兩個浮點數(shù)是否相等。

正確比較浮點數(shù)的方法

1.使用round方法處理后再比較

例子:

<?php
$a = 0.1;
$b = 0.9;
$c = 1;
var_dump(($c-$b)==$a);          // false
var_dump(round(($c-$b),1)==round($a,1)); // true
?>

2.使用高精度運(yùn)算方法

首先進(jìn)行運(yùn)算時,使用高精度的運(yùn)算方法,這樣可以保證精度不丟失。

高精度運(yùn)算的方法如下:

bcadd 將兩個高精度數(shù)字相加

bccomp 比較兩個高精度數(shù)字,返回-1,0,1

bcdiv 將兩個高精度數(shù)字相除

bcmod 求高精度數(shù)字余數(shù)

bcmul 將兩個高精度數(shù)字相乘

bcpow 求高精度數(shù)字乘方

bcpowmod 求高精度數(shù)字乘方求模

bcscale 配置默認(rèn)小數(shù)點位數(shù),相當(dāng)于Linux bc中的”scale=”

bcsqrt 求高精度數(shù)字平方根

bcsub 將兩個高精度數(shù)字相減

例子:

<?php
$a = 0.1;
$b = 0.9;
$c = 1;
var_dump(($c-$b)==$a);     // false
var_dump(bcsub($c, $b, 1)==$a); // true
?>

以上就是本文的全部內(nèi)容,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,同時也希望多多支持腳本之家!

相關(guān)文章

  • PHP基于swoole多進(jìn)程操作示例

    PHP基于swoole多進(jìn)程操作示例

    這篇文章主要介紹了PHP基于swoole多進(jìn)程操作,結(jié)合實例形式分析了php使用swoole多進(jìn)程實現(xiàn)多個任務(wù)同時執(zhí)行以及大任務(wù)劃分成多個小任務(wù)相關(guān)操作技巧,需要的朋友可以參考下
    2019-08-08
  • PHP實現(xiàn)的支付寶支付功能示例

    PHP實現(xiàn)的支付寶支付功能示例

    這篇文章主要介紹了PHP實現(xiàn)的支付寶支付功能,結(jié)合實例形式分析了php使用支付寶接口實現(xiàn)支付功能相關(guān)操作技巧,需要的朋友可以參考下
    2019-03-03
  • 小文件php+SQLite存儲方案

    小文件php+SQLite存儲方案

    在互聯(lián)網(wǎng)快速發(fā)展的背景下,網(wǎng)絡(luò)上的數(shù)據(jù)內(nèi)容呈幾何級的增長,而其中增長最快并且最容易給信息基礎(chǔ)架構(gòu)帶來挑戰(zhàn)的就是數(shù)目龐大的小文件(如圖片、電子圖書、郵件等)。
    2010-09-09
  • 輸入值/表單提交參數(shù)過濾有效防止sql注入的方法

    輸入值/表單提交參數(shù)過濾有效防止sql注入的方法

    輸入值/表單提交參數(shù)過濾可以有效防止sql注入或非法攻擊,下面為大家介紹些不錯的方法,感興趣的不要錯過
    2013-12-12
  • pdo中使用參數(shù)化查詢sql

    pdo中使用參數(shù)化查詢sql

    在使用參數(shù)化查詢的情況下,數(shù)據(jù)庫服務(wù)器不會將參數(shù)的內(nèi)容視為SQL指令的一部份來處理,而是在數(shù)據(jù)庫完成 SQL 指令的編譯后,才套用參數(shù)運(yùn)行,因此就算參數(shù)中含有具破壞性的指令,也不會被數(shù)據(jù)庫所運(yùn)行。
    2011-08-08
  • php返回相對時間(如:20分鐘前,3天前)的方法

    php返回相對時間(如:20分鐘前,3天前)的方法

    這篇文章主要介紹了php返回相對時間的方法,可實現(xiàn)返回如:20分鐘前、3天前等格式時間,非常具有實用價值,需要的朋友可以參考下
    2015-04-04
  • php中用memcached實現(xiàn)頁面防刷新功能

    php中用memcached實現(xiàn)頁面防刷新功能

    這篇文章主要介紹了php中用memcached實現(xiàn)頁面防刷新功能,這是一個比較安全、穩(wěn)定的防刷新方案,需要的朋友可以參考下
    2014-08-08
  • 解析smarty模板中類似for的功能實現(xiàn)

    解析smarty模板中類似for的功能實現(xiàn)

    本篇文章是對smarty模板中類似for的功能實現(xiàn)方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-06-06
  • PHP使用棧解決約瑟夫環(huán)問題算法示例

    PHP使用棧解決約瑟夫環(huán)問題算法示例

    這篇文章主要介紹了PHP使用棧解決約瑟夫環(huán)問題算法,簡單描述了約瑟夫環(huán)問題并給出了PHP使用棧解決約瑟夫環(huán)的相關(guān)算法實現(xiàn)技巧,需要的朋友可以參考下
    2017-08-08
  • PHP中的strtr函數(shù)使用介紹(str_replace)

    PHP中的strtr函數(shù)使用介紹(str_replace)

    PHP的 strtr 函數(shù), 性能要比 str_replace 函數(shù)高, 可以代替 str_replace 來使用
    2011-10-10

最新評論

杭州市| 墨脱县| 宜宾县| 永泰县| 兰坪| 黎城县| 句容市| 安远县| 六安市| 新竹县| 海林市| 电白县| 阿拉善右旗| 八宿县| 禹州市| 开化县| 商水县| 韶山市| 宜黄县| 江津市| 清徐县| 来凤县| 邢台县| 云梦县| 琼中| 满洲里市| 合川市| 建始县| 云和县| 拜城县| 汉源县| 泸州市| 华池县| 封丘县| 什邡市| 万年县| 珠海市| 饶阳县| 天津市| 电白县| 烟台市|