奶头挺立呻吟高潮av全片,成人试看120秒体验区,性欧美极品v,A片高潮抽搐揉捏奶头视频

php語言

PHP中浮點數(shù)的計算問題

時間:2024-08-09 18:42:16 php語言 我要投稿
  • 相關(guān)推薦

PHP中浮點數(shù)的計算問題

  與筆記使人精確。史鑒使人明智;詩歌使人巧慧;數(shù)學使人精細;博物使人深沉;邏輯與修辭使人善辯。以下是小編為大家搜索整理的PHP中浮點數(shù)的計算問題,希望能給大家?guī)韼椭?更多精彩內(nèi)容請及時關(guān)注我們應屆畢業(yè)生考試網(wǎng)!

  如果用php的+-*/計算浮點數(shù)的時候,可能會遇到一些計算結(jié)果錯誤的問題,比如echo intval( 0.58*100 );會打印57,而不是58,這個其實是計算機底層二進制無法精確表示浮點數(shù)的一個bug,是跨語言的,我用python也遇到這個問題。所以基本上大部分語言都提供了精準計算的類庫或函數(shù)庫,比如php有BC高精確度函數(shù)庫,下面達內(nèi)php培訓老師介紹一下一些常用的BC高精確度函數(shù)使用。

  例子

 代碼如下  
<?php    $f = 0.58;    var_dump(intval($f * 100)); //為啥輸出57?>

  為啥輸出是57啊? PHP的bug么?

  我相信有很多的同學有過這樣的疑問, 因為光問我類似問題的人就很多, 更不用說bugs.php.net上經(jīng)常有人問…

  要搞明白這個原因, 首先我們要知道浮點數(shù)的表示(IEEE 754):

  浮點數(shù), 以64位的長度(雙精度)為例, 會采用1位符號位(E), 11指數(shù)位(Q), 52位尾數(shù)(M)表示(一共64位).

  符號位:最高位表示數(shù)據(jù)的正負,0表示正數(shù),1表示負數(shù)。

  指數(shù)位:表示數(shù)據(jù)以2為底的冪,指數(shù)采用偏移碼表示

  尾數(shù):表示數(shù)據(jù)小數(shù)點后的有效數(shù)字.

  這里的關(guān)鍵點就在于, 小數(shù)在二進制的表示, 關(guān)于小數(shù)如何用二進制表示, 大家可以百度一下, 我這里就不再贅述, 我們關(guān)鍵的要了解, 0.58 對于二進制表示來說, 是無限長的值(下面的數(shù)字省掉了隱含的1)..

  0.58的二進制表示基本上(52位)是: 00101000111101011100001010001111010111000010100011110.57的二進制表示基本上(52位)是: 001000111101011100001010001111010111000010100011110而兩者的二進制, 如果只是通過這52位計算的話,分別是:www.111cn.net

  0.58 -> 0.579999999999999960.57 -> 0.5699999999999999至于0.58 * 100的具體浮點數(shù)乘法, 我們不考慮那么細, 有興趣的可以看(Floating point), 我們就模糊的以心算來看… 0.58 * 100 = 57.999999999

  那你intval一下, 自然就是57了….

  可見, 這個問題的關(guān)鍵點就是: “你看似有窮的小數(shù), 在計算機的二進制表示里卻是無窮的”

  so, 不要再以為這是PHP的bug了, 這就是這樣的…..

  PHP浮點型在進行+-*%/存在不準確的問題

  例如:

  1.

  $a = 0.1;

  $b = 0.7;

  var_dump(($a + $b) == 0.8);

  打印出來的值為 boolean false

  這是為啥?PHP手冊對于浮點數(shù)有以下警告信息:

  Warning

  浮點數(shù)精度

  顯然簡單的十進制分數(shù)如同 0.1 或 0.7 不能在不丟失一點點精度的情況下轉(zhuǎn)換為內(nèi)部二進制的格式。這就會造成混亂的結(jié)果:例如,floor((0.1+0.7)*10) 通常會返回 7 而不是預期中的 8,因為該結(jié)果內(nèi)部的表示其實是類似 7.9999999999…。

  這和一個事實有關(guān),那就是不可能精確的用有限位數(shù)表達某些十進制分數(shù)。例如,十進制的 1/3 變成了 0.3333333. . .。

  所以永遠不要相信浮點數(shù)結(jié)果精確到了最后一位,也永遠不要比較兩個浮點數(shù)是否相等。如果確實需要更高的精度,應該使用任意精度數(shù)學函數(shù)或者 gmp 函數(shù)

 代碼如下  

<?php

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

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

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

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

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

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

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

  bcpowmod — 求高精度數(shù)字乘方求模,數(shù)論里非常常用

  bcscale — 配置默認小數(shù)點位數(shù),相當于就是Linux bc中的”scale=”

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

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

  整理了一些實例

  php BC高精確度函數(shù)庫包含了:相加,比較,相除,相減,求余,相乘,n次方,配置默認小數(shù)點數(shù)目,求平方。這些函數(shù)在涉及到有關(guān)金錢計算時比較有用,比如電商的價格計算。

 代碼如下  
/**
  * 兩個高精度數(shù)比較
  * 
  * @access global
  * @param float $left
  * @param float $right
  * @param int $scale 精確到的小數(shù)點位數(shù)
  * 
  * @return int $left==$right 返回 0 | $left<$right 返回 -1 | $left>$right 返回 1
  */
var_dump(bccomp($left=4.45, $right=5.54, 2));
// -1
  
 /**
  * 兩個高精度數(shù)相加
  * 
  * @access global
  * @param float $left
  * @param float $right
  * @param int $scale 精確到的小數(shù)點位數(shù)
  * 
  * @return string 
  */
var_dump(bcadd($left=1.0321456, $right=0.0243456, 2));
//1.04
 
  /**
  * 兩個高精度數(shù)相減
  * 
  * @access global
  * @param float $left
  * @param float $right
  * @param int $scale 精確到的小數(shù)點位數(shù)
  * 
  * @return string 
  */
var_dump(bcsub($left=1.0321456, $right=3.0123456, 2));
//-1.98
  
 /**
  * 兩個高精度數(shù)相除
  * 
  * @access global
  * @param float $left
  * @param float $right
  * @param int $scale 精確到的小數(shù)點位數(shù)
  * 
  * @return string 
  */
var_dump(bcdiv($left=6, $right=5, 2));
//1.20
 
 /**
  * 兩個高精度數(shù)相乘
  * 
  * @access global
  * @param float $left
  * @param float $right
  * @param int $scale 精確到的小數(shù)點位數(shù)
  * 
  * @return string 
  */
var_dump(bcmul($left=3.1415926, $right=2.4569874566, 2));
//7.71
 
 /**
  * 設(shè)置bc函數(shù)的小數(shù)點位數(shù)
  * 
  * @access global
  * @param int $scale 精確到的小數(shù)點位數(shù)
  * 
  * @return void 
  */ 
bcscale(3);
var_dump(bcdiv('105', '6.55957')); 
// 16.007

  注意點:關(guān)于設(shè)置的位數(shù),超出部分是丟棄掉,而不是四舍五入。

【PHP中浮點數(shù)的計算問題】相關(guān)文章:

PHP浮點數(shù)是什么06-27

php中zend相對路徑問題10-29

php字符串截取問題05-02

PHP中多態(tài)如何實現(xiàn)09-04

PHP中實現(xiàn)頁面跳轉(zhuǎn)07-06

PHP中this關(guān)鍵字06-08

PHP中的trait是什么08-13

完美解決PHP中文亂碼問題07-18

php中fsockopen用法實例06-20

PHP前端開發(fā)中的性能05-25

主站蜘蛛池模板: 翼城县| 自治县| 哈尔滨市| 白城市| 邢台县| 新竹县| 金溪县| 东丽区| 凌源市| 玉环县| 奉新县| 新密市| 田阳县| 祁连县| 芷江| 古交市| 靖江市| 磐安县| 长泰县| 乐安县| 葫芦岛市| 宿迁市| 乌拉特前旗| 凤城市| 沂源县| 瑞安市| 津南区| 会泽县| 蓬安县| 新丰县| 枝江市| 峡江县| 东辽县| 错那县| 茶陵县| 罗源县| 丹巴县| 淅川县| 宜昌市| 社会| 瓮安县|