浮点数几个易错点

参看资料:

浮点数指南:http://floating-point-gui.de/ (后面我会翻译)
php官方文档:
http://php.net/manual/zh/language.types.float.php
http://php.net/manual/zh/language.types.integer.php#language.types.integer.casting
http://php.net/manual/zh/language.types.type-juggling.php

先来看个例子eg1.

1
2
3
4
<?php
$n = "19.99";
print intval($n * 100).chr(10);
print intval(strval($n*100));

得出来的结果是:1998和1999

另外一个例子eg2.

1
2
<?php
echo (int) ((0.1+0.7) * 10);

结果是:7

官方文档给出的警告是:

决不要将未知的分数强制转换为int类型,这样有时会导致不可预料的结果。

在例子1中,$n与100相乘后被转换为了浮点数,实际上是1998.99999999999984368059813278E1,强制转换为整数后就为1998.

例子2也是,未转换前的结果实际是7.9999999999999991118…,强制转换后为7.

所以正如官网上所说:

永远不要相信浮点数精确到了最后一位,也永远不要直接比较俩浮点数是否相等。

比如下面的例子eg3.

1
2
3
4
<?php
$x = 8 - 6.4;
$y = 1.6;
var_dump($x == $y);

结果并不相等,因为$x实际已经不是1.6了,而是1.5999999…. var_dump只是给你显示最近的数1.6