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