- PHP面試一戰到底
- 閆小坤
- 616字
- 2022-07-28 19:21:32
2.3 浮點型
2.3.1 概念
浮點型(float或double)表示的變量屬于實數的集合。在C語言里,float和double是不同的類型,但在PHP語言里,兩者沒有區分,都是float類型。PHP的浮點數采用IEEE二進制浮點數算術標準(IEEE 754),通常最大值是1.8e308并具有14位十進制數字的精度(64位IEEE格式)。
浮點數的表示方法一般有兩種:使用小數點和科學計數法,如表2-4所示。
表2-4 浮點數的表示方法

2.3.2 面試題:浮點數的比較
題目描述:比較兩個浮點數是否相等。
程序代碼如下:(源碼文件:ch02/float_compare.php)
1 <?php 2 var_dump(0.3 == 3e-1);//bool(true) 3 var_dump(0.3 == 0.1 + 0.2);//bool(false) 4 var_dump(1100.80 * 100 == 110080);//bool(true) 5 var_dump(1100.85 * 100 == 110085);//bool(false) 6 ?>
為什么第3行和第5行的結果是false呢?原因在于浮點數在計算機內部的表示。例如IEEE 754標準 對64位的雙精度數字的表示如表2-5所示。
表2-5 IEEE 754標準對64位的雙精度數字的表示

雙精度數所能表示的有效數字位數為52,由于有效數字最左位一定是1,所以共有53位。
log 253≈15.95
所以,一般來說,對于64位的雙精度數字,只有前15位的有效數字是有意義的,這保證了最大誤差一般不大于10-16。
例如:
<?php var_dump(0.3 - (0.1+0.2)); //Output float(-5.5511151231258E-17) ?>
需要注意,任何拋棄精度談浮點數的比較都是無意義的。
2.3.3 面試題:證明題
題目描述:證明0.999…=1。
方法1:已知,將兩端同時乘以3,則得到1=0.999…。
方法2:0.999…可表示為以下等比數列之和:
0.9,0.09,0.009,…
而等比數列之和為
由此得證。
以上不是數學上嚴謹的證明方法,這里僅作為例子加強大家對浮點數的理解。
2.3.4 面試題:比較兩個浮點數的大小
題目描述:怎么比較兩個浮點數的大小?
任何拋棄精度談浮點數的比較都是無意義的。但可以設置一定的精度來比較兩個浮點數。
精度一般用希臘字母ε(epsilon)來表示。
程序代碼如下:(源碼文件:ch02/float_compare_epsilon.php)
<?php $epsilon = 1e-10;//精度為10的-10次方 $a = 0.3; $b = 0.1+0.2; //不使用精度 var_dump($a - $b == 0);//bool(false) //使用精度 var_dump(abs($a - $b) <= $epsilon);//bool(true) ?>
推薦閱讀
- 大話PLC(輕松動漫版)
- Unreal Engine Physics Essentials
- 自制編譯器
- 深入實踐Spring Boot
- Learning ASP.NET Core 2.0
- Learning ArcGIS Pro
- Hands-On GPU:Accelerated Computer Vision with OpenCV and CUDA
- 程序是怎樣跑起來的(第3版)
- Visual Basic程序設計實驗指導(第二版)
- Kotlin編程實戰:創建優雅、富于表現力和高性能的JVM與Android應用程序
- Statistical Application Development with R and Python(Second Edition)
- SwiftUI極簡開發
- 超簡單:Photoshop+JavaScript+Python智能修圖與圖像自動化處理
- Building a Media Center with Raspberry Pi
- Spring Boot 2+Thymeleaf企業應用實戰