成人精品一区二区三区中文字幕-成人精品一区二区三区-成人精品一级毛片-成人精品亚洲-日本在线视频一区二区-日本在线视频免费

導航首頁 ? 技術教程 ? php 浮點數比較方法詳解
全站頭部文字 我要出現在這里
php 浮點數比較方法詳解 719 2024-01-10   

浮點數運算精度問題

首先看一個例子:

<?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,錯誤

為什么會這樣呢?

運算后,精度為20位時實際返回的內容如下:

<?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

出現這個問題是因為浮點數計算涉及精度,當浮點數轉為二進制時有可能會造成精度丟失。

浮點數轉二進制方法

整數部分采用除以2取余方法

小數部分采用乘以2取整方法

例如:把數字8.5轉為二進制

整數部分是8

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

1比2小,因此不需要計算下去,整數8的二進制為 1000

小數部分是0.5

0.5x2 = 1.0

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

小數0.5的二進制為 0.1

8.5的二進制為1000.1

計算數字0.9的二進制

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

…. 之后不斷循環下去,當截取精度為N時,N后的數會被舍去,導致精度丟失。

上例中0.9在轉為二進制時精度丟失,導致比較時出現錯誤。

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

正確比較浮點數的方法

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.使用高精度運算方法

首先進行運算時,使用高精度的運算方法,這樣可以保證精度不丟失。

高精度運算的方法如下:

bcadd 將兩個高精度數字相加

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

bcdiv 將兩個高精度數字相除

bcmod 求高精度數字余數

bcmul 將兩個高精度數字相乘

bcpow 求高精度數字乘方

bcpowmod 求高精度數字乘方求模

bcscale 配置默認小數點位數,相當于Linux bc中的”scale=”

bcsqrt 求高精度數字平方根

bcsub 將兩個高精度數字相減

例子:

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

以上就是本文的全部內容,希望本文的內容對大家的學習或者工作能帶來一定的幫助,同時也希望多多支持綠夏網!



主站蜘蛛池模板: 胸肌图片| 素珍| 罗志祥小猪视频app全部| 燃烧电影| 以家人之名小说原著| 《保姆妈妈》电视剧| 林正英僵尸大全免费看| 《致青春》电影| 在线电影免费| 爱情插班生| 意大利人在俄罗斯的奇遇| 武林外传豆瓣| 架子姐姐| 诡娃| 阿莫西林原研药| 韩国手机电影| 汪汪队完整版全集免费 | 我和我的少年时光| 《猫女的诅咒》美国电影| 无锡旅游地图| 刘洋男演员| 美丽的坏女人中文字幕| 真正的正义韩国电影 | 曹东| 生物七年级下册人教版电子书| 在线黄网站| 《韩国小姐》| 白皮书电影| hugh grant| 语文五年级下册期末试卷人教版| 秘密之门| 大太监李莲英| 美女网站视频免费黄| 熊出没在线播放| 教育在线教育平台直播| 白培中| 狗叫声吸引狗| 乔治失踪的日子| 彭丹丹主演的经典电影| 大森南朋| 少年圆鱼洲 综艺|

?。?!站長長期在線接?。?!

網站、小程序:定制開發/二次開發/仿制開發等

各種疑難雜癥解決/定制接口/定制采集等

站長微信:lxwl520520

站長QQ:1737366103