作者jonathanmeow (喵)
看板Ajax
标题Re: [问题] 计算精确度的问题
时间Thu Jan 10 15:48:32 2008
※ 引述《fillano (冒牌费大公)》之铭言:
: 今天在javaworld看到一个问题,我自己试了一下,发现
: a=0.82;
: alert(a+1-1);
: 在ie会显示0.8199999999999998
: 在ff会显示0.8199999999999998
: 这是什麽原因呢?
这我之前做FLASH的时候也发生同样的问题
trace出来的值明明就是0.82
可是要他判断(0.82+1-1)==a的时候
就会传出false
这是因为二进位的问题 感谢FLASH版的高手给的方向
之後有看到书上说到
0.82要转换成二进位,由於是纯小数,所以要直接乘以2然後取整数部分
剩下的小数部分再乘以2,一直下去
(最後答案是什麽我忘记怎麽表示了 但方法好像就是这样)
但是这样的转换会有没办法刚好乘起来是整数,因此就会有无限循环的状况
刚在excel上面测试0.82这样一直乘以2,然後取整数,会发现小数会有重复
(另外发现excel也会有出现不精准的状况)
那其实这样的数字是很接近很接近原本我们要的十进位数字
因此我在判断是否相同的时候
会将两数相减 然後乘以一个倍数 如1000000等
(越大越精准 但不晓得可以精准到什麽地步)
再用四舍五入法去取 最後等於0的话
就代表这两个数字相当接近
哈 这是我的作法啦
讲好多 但是观念并没有非常确定 有错还请指教
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 163.19.207.224
1F:→ sly9:请参看IEEE754号标准。所有的使用浮点数来计算的语言都有这个 01/10 17:02
2F:→ sly9:问题﹐如果对精度十分敏感的话﹐可以选择使用各个语言的大数 01/10 17:03
3F:→ sly9:库﹐即是用字符串来记录结果﹐但这个效率太成问题。 01/10 17:04
4F:→ fillano:所以c/c++的标准函式库并不使用IEEE754罗? 01/10 17:17
5F:→ sly9:一定也是用的IEEE754,不过可能有最终显示格式的区别。比如 01/10 18:15
6F:→ sly9:只显示5位有效数字之类的。但不代表它就是"精准的" 01/10 18:15
7F:推 LPH66:所以通常在运算上不直接比较两个浮点数是否相等 01/10 22:38
8F:→ LPH66:而是相减後绝对值小於某个值(如1e-6)就视为相等 01/10 22:39
9F:→ fillano:了解,谢啦 01/11 11:23