主题:  怎么得到小数位

yufang

职务:普通成员
等级:1
金币:0.0
发贴:108
#12003/9/1 15:31:53
一个四位数作为基数,除以80
得到的余数再减去整数,再将得出的小数位乘以80
该怎么写

我的是
z_ver=(z_gsm/80-int(z_gsm/80))*80
结果老是不对

举个例子z_gsm=6666时
6666/80=83.325
83.325去掉整数为得0.325
0.325*80=26

但我用z_ver=(z_gsm/80-int(z_gsm/80))*80得出的是26.0000000000002
但z_gsm=5555时又正确



whoisspider

职务:普通成员
等级:1
金币:1.0
发贴:245
#22003/9/1 17:43:20
首先,你的表达式的意思无非就是要取得不能被80除的余数。
实际上你的表达式可以这样写成这样:
z_ver=z_gsm mod 80
表达同样的意思而且不会出错!
还有你得到的值应该是个整数,那你可以写成这样!
z_ver=z_gsm-int(z_gsm/80)*80
当然写成最上面的是最简单明了的!

至于最下面你说的误差问题,事实上是由于进制问题造成的,我们习惯上都是用10进制进行计算,很可惜,电脑却不是10进制的,而是二进制的!(事实上正因为电脑采用二进制才发明成功)
你说的26/80=0.325在10进制中的确不是个无限循环小数。很可惜,在二进制表达中这个数就是无限循环小数。那么就很好理解这个误差的产生了!
比如你说的5555,结果小数应该是0.4375,用二进制表达正好是0.0111,不是循环小数,自然没有误差了。
事实上,在涉及复杂计算过程中,比较两个实数是否相等是很难的,也许在10进制中两个数的最终计算结果应该完全相等,但在二进制中由于进制不同带来的误差是有不同的,这时候判断两个值是否相等不是用
if a=b then
而是
if a-b<0.00007 then
来判断两者的数是否在误差许可的范围内!

我只能点到为止,二进制的介绍可以去网上查查相关内容!

编辑历史:[这消息被whoisspider编辑过(编辑时间2003-09-01 17:45:00)]
[这消息被whoisspider编辑过(编辑时间2003-09-01 17:47:49)]


janlay

职务:管理员
等级:7
金币:28.0
发贴:7244
#32003/9/1 18:34:59
嗯,是这样的,这一点在 C 编程环境中犹为明显,一个很典型的经验就是在判断浮点数是否相等时,一般到取差值,如果很小时就认为相等

编辑历史:[这消息被janlay编辑过(编辑时间2003-09-01 18:35:38)]