这是喳回事啊?100-100<>0 ?

软件和网站开发以及相关技术探讨
回复
sqlfm
帖子: 356
注册时间: 2007-02-15 6:26

这是喳回事啊?100-100<>0 ?

#1

帖子 sqlfm » 2007-10-26 13:18

<?php
$a = 100.80;
$a += 100.00;
$a += -100.00;
echo 100.80-$a;
//结果输出:-1.4210854715202E-14
?>

但是把 $a=100.00 却是正常嗯。请指教。
2007:琉璃地,旃檀林。心心作。念念是。
头像
BigSnake.NET
帖子: 12522
注册时间: 2006-07-02 11:16
来自: 廣州
联系:

#2

帖子 BigSnake.NET » 2007-10-26 13:22

浮点误差,正常的
^_^ ~~~
要理解递归,首先要理解递归。

地球人都知道,理论上,理论跟实际是没有差别的,但实际上,理论跟实际的差别是相当大滴。
sqlfm
帖子: 356
注册时间: 2007-02-15 6:26

#3

帖子 sqlfm » 2007-10-26 13:29

你就这么轻松把我打发了?

这跟 php 版本有关吗?好像一个HOLE ? 要查看所有的 PHP 页噢?汗人!
2007:琉璃地,旃檀林。心心作。念念是。
头像
BigSnake.NET
帖子: 12522
注册时间: 2006-07-02 11:16
来自: 廣州
联系:

#4

帖子 BigSnake.NET » 2007-10-26 13:34

sqlfm 写了:你就这么轻松把我打发了?

这跟 php 版本有关吗?好像一个HOLE ? 要查看所有的 PHP 页噢?汗人!
这是因为计算机储存浮点数的方式引起的
应该是编程常识啊..
^_^ ~~~
要理解递归,首先要理解递归。

地球人都知道,理论上,理论跟实际是没有差别的,但实际上,理论跟实际的差别是相当大滴。
头像
oneleaf
论坛管理员
帖子: 10441
注册时间: 2005-03-27 0:06
系统: Ubuntu 12.04

#5

帖子 oneleaf » 2007-10-26 13:41

这是一个特例,由于 100.8 无法使用二进制来正确的表达,而反复被计算,加大了误差就形成了类似的结果。

这种数字还有很多,例如: 2.97 8.03 等等。
sqlfm
帖子: 356
注册时间: 2007-02-15 6:26

#6

帖子 sqlfm » 2007-10-26 13:44

oneleaf 写了:这是一个特例,由于 100.8 无法使用二进制来正确的表达,而反复被计算,加大了误差就形成了类似的结果。

这种数字还有很多,例如: 2.97 8.03 等等。
哇!你这么牛啊。

那我写了几年的 PHP 都凑巧给我过了噢。IT 这一行真是越作越笨了我。
2007:琉璃地,旃檀林。心心作。念念是。
头像
BigSnake.NET
帖子: 12522
注册时间: 2006-07-02 11:16
来自: 廣州
联系:

#7

帖子 BigSnake.NET » 2007-10-26 13:45

如果小数部分可以刚好化为2进制的有限小数,且所有有效数字长度不超过浮点类型规定的长度,就可以无误差
例如 0.25(10)=0.01(2)=1.0(2)* 2^-2
^_^ ~~~
要理解递归,首先要理解递归。

地球人都知道,理论上,理论跟实际是没有差别的,但实际上,理论跟实际的差别是相当大滴。
头像
BigSnake.NET
帖子: 12522
注册时间: 2006-07-02 11:16
来自: 廣州
联系:

#8

帖子 BigSnake.NET » 2007-10-26 13:52

所以判断浮点值是否相等, 一般来说都要用三出口函数

int cmp(float a,float b){
if ( abs(a-b)<某个很小的值 ) return 0;
if (a>b) return 1;
if (a<b) return -1;
}
^_^ ~~~
要理解递归,首先要理解递归。

地球人都知道,理论上,理论跟实际是没有差别的,但实际上,理论跟实际的差别是相当大滴。
头像
bones7456
帖子: 8495
注册时间: 2006-04-12 20:05
来自: 杭州
联系:

#9

帖子 bones7456 » 2007-10-26 14:42

就算你不加100也不减100,也会出这样的错吧.
关注我的blog: ε==3
回复