官术网_书友最值得收藏!

  • 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標準https://zh.wikipedia.org/wiki/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)
?>
主站蜘蛛池模板: 新田县| 正镶白旗| 旺苍县| 镶黄旗| 虎林市| 阿鲁科尔沁旗| 亳州市| 海淀区| 乐至县| 临桂县| 四平市| 西乡县| 婺源县| 台安县| 彩票| 永仁县| 扬中市| 渝中区| 长岭县| 万山特区| 闽清县| 泾源县| 太康县| 剑阁县| 黄龙县| 达日县| 米林县| 山丹县| 楚雄市| 铜川市| 化德县| 平遥县| 南康市| 民勤县| 平和县| 东城区| 合阳县| 象州县| 临海市| 东丽区| 景洪市|