This topic created in 4870 days ago, the information mentioned may be changed or developed.
<?php
$x1 = 80.89;
$x2 = 81.88;
$x = $x1;
while($x <= $x2) {
$x += 0.01;
echo $x;
echo '<br />';
}
运行看最后2行结果,如何解释?
把$x1的值调大一点又正常了
11 replies • 1970-01-01 08:00:00 +08:00
 |
|
1
PrideChung Jan 22, 2013
PHP的浮点数存在精度问题(其实很多编程语言都有),如果你不停地对一个变量进行浮点数运算,误差就会积累,直到显示出来。运行一下下面的脚本,道理都是一样的。如果你需要更高精度的浮点数运算,请使用bcmath库。
<?php $i = 0; while($i < 10) { $i+=0.001 ; echo $i . '<br />'; }
|
 |
|
2
laoyuan Jan 22, 2013
手册 - 语言参考 - 类型 - 浮点型,你会找到答案。你可以用var_dump看各变量都是什么值。
通俗的说,在php里,浮点型在运算时是一个近似值。
|
 |
|
3
laoyuan Jan 22, 2013
可能每一个学习PHP的人都遇到过这问题吧,我搞明白这东西大概花了两个晚上。
|
 |
|
4
zhangxiao Jan 22, 2013
计算机的二进制无法精确的表示浮点数的,小数都被近似于一个能被表示成: 0.5+0.25+0.125+... 这么一个值,当然这里的加项不一定都出现,取决于具体数值了。其实和整数部分一个道理: 1+2+4+8...
|
 |
|
5
Sunyanzi Jan 22, 2013
这是计算机的老毛病了 ... 计算机内部数值以二进制存储 ...
而在十进制下面的有限小数转化为二进制之后可能就是无限小数 ...
显而易见计算机没办法存储无限位的数字 ...
所以这导致了有些浮点数没办法精确的转换为二进制才造成误差 ...
|
 |
|
6
laoyuan Jan 22, 2013
我觉得智能一点的语言应该按人的思维习惯将整数部分和小数部分分成两个整型保存。。。。
|
 |
|
7
luikore Jan 22, 2013
1.4+1.7 得到两种答案: 3.0999999999999996 和 3.1, 哪个更精确?
答案是前者, 因为有效数字更多...
|
 |
|
10
xcl3721 Jan 23, 2013
bcmath看看,听说金融都用这个插件算
|
 |
|
11
bombless Jan 23, 2013
噗,各位不了解的可以去了解下IEEE754是什么……这完全不是PHP的问题。
精度损失其实很常见,只不过你用的十进制小数表示法有时候把这个问题凸显出来了于是你就不淡定了……
|