标签:
做电子商务的时候一般会涉及到金额的比较,按正常的思路来看用><=这些个符号就可以了。可是要是到程序上来搞这个的话就出大事了。现在看下这段代码:
$f = 0.07; var_dump($f * 100 == 7);//输出false
输出结果会出乎大家意料,输出false,为什么会这样呢?其实这个和电脑中存储小数的原理有关。大家都知道计算机只能存储0和1,我们日常生活习惯使用的是10进制的数据,像0.07这个小数在计算机中存储时会有精度损失,以至于计算出来的结果会有偏差。
那么怎么解决这个问题?虽然计算机存储小数有偏差,但是偏差还是非常小,像上例中0.07 * 100如果显示出小数点后面20位的话,最终的值如下
$f = 0.07;//输出7.00000000000000088818echo number_format($f * 100, 20)$f = 0.07;var_dump($f * 100 == 7);//输出0,表示两个数字精度为小数点后3位的时候相等var_dump(bccomp($f * 100, 7, 3));$bin = "";$int = 7;$base = 100;echo "<table border=‘1‘>";echo "<td width=‘50‘>位数</td>";echo "<td width=‘50‘>x2</td>";echo "<td width=‘50‘>位值</td>";for ($i = 0; $i <= 60; $i++) { echo "<tr>"; echo "<td>$i</td>"; $int = $int * 2; echo "<td>$int</td>"; if ($int == 100) { $bin.="1"; echo "<td>1</td>"; break; } if ($int > 100) { $bin.="1"; $int = $int - $base; echo "<td>1</td>"; } else { $bin .= "0"; echo "<td>0</td>"; } echo "</td>"; echo "</tr>";}echo "</table>";echo $bin;/* 输出内容 0.070000000000000006661338147751 0.070000000000000006661338147751 */$f = 0.0;$bin = "0001000111101011100001010001111010111000010100011110101110000";$l = strlen($bin);for ($i = 0; $i < $l; $i++) { if ($bin[$i] > 0) { $f = $f + pow(2, -($i + 1)); }}echo number_format($f, 30);$f = 0.07;echo "<br />";echo number_format($f, 30);标签:
原文地址:http://www.cnblogs.com/jackluo/p/5549003.html