首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > JavaScript >

关于JavaScript中计算精度丢失的有关问题

2012-10-09 
关于JavaScript中计算精度丢失的问题转贴:http://rockyee.iteye.com/blog/891538摘要: 由于计算机是用二进

关于JavaScript中计算精度丢失的问题

转贴:http://rockyee.iteye.com/blog/891538

摘要:
由于计算机是用二进制来存储和处理数字,不能精确表示浮点数,而JavaScript中没有相应的封装类来处理浮点数运算,直接计算会导致运算精度丢失。
为了避免产生精度差异,把需要计算的数字升级(乘以10的n次幂)成计算机能够精确识别的整数,等计算完毕再降级(除以10的n次幂),这是大部分编程语言处理精度差异的通用方法。
关键词:
计算精度 四舍五入 四则运算 精度丢失
1. 疑惑
我们知道,几乎每种编程语言都提供了适合货币计算的类。例如C#提供了decimal,Java提供了BigDecimal,JavaScript提供了Number……
由于之前用decimal和BigDecimal用得很好,没有产生过精度问题,所以一直没有怀疑过JavaScript的Number类型,以为可以直接使用Number类型进行计算。但是直接使用是有问题的。
我们先看看四舍五入的如下代码:

?关于JavaScript中计算精度丢失的有关问题?关于JavaScript中计算精度丢失的有关问题?关于JavaScript中计算精度丢失的有关问题?关于JavaScript中计算精度丢失的有关问题?关于JavaScript中计算精度丢失的有关问题?关于JavaScript中计算精度丢失的有关问题?关于JavaScript中计算精度丢失的有关问题?关于JavaScript中计算精度丢失的有关问题?关于JavaScript中计算精度丢失的有关问题?关于JavaScript中计算精度丢失的有关问题?关于JavaScript中计算精度丢失的有关问题?关于JavaScript中计算精度丢失的有关问题
    function?testRound() ??{ ??????var?dt,?dtBegin,?dtEnd,?i; ??????dtBegin?=?new?Date(); ??????for?(i=0;?i<100000;?i++) ??????{ ??????????dt?=?new?Date(); ??????????Number("0."?+?dt.getMilliseconds()).toFixed(2); ??????} ??????dtEnd?=?new?Date(); ??????alert(dtEnd.getTime()-dtBegin.getTime()); ??}??


为了避免对同一个数字进行四舍五入运算有缓存问题,我们取当前毫秒数进行四舍五入。经验证,在同一台机器上运算10万次的情况下,用movePoint方法,平均耗时2500毫秒;用正则表达式方法,平均耗时4000毫秒。

热点排行