javascript浮点数计算的bug
来源:asp之家 发布时间:2009-12-06 11:43:00
js浮点数计算有时是不准确的,比如7*0.8 == 7*8/10的值为false,因为7*0.8=5.6000000000000005,乘出了误差。这种误差出现的概率有多少呢?写个demo瞅瞅,计算i/10*100 == i*10,i从2000自增到12000,整个过程使用200毫秒左右。所有标红的记录都是计算结果有误差的情况。总共执行乘法20000次,除法10000次.
demo:http://www.uedmagazine.com/test/js_float_1.html
给Number增加三个计算浮点数的方法,乘法、加法、除法,减法和加法一样:
Number.prototype.div = function(arg){
if(!/\./.test(this) && !/\./.test(arg)){
return this/arg;
}
var arg1 = this;
var arg2 = arg;
var t1=0,t2=0,r1,r2,s1=arg1.toString(),s2=arg1.toString();
if(s1.indexOf('.')>=0)t1 = s1.split(".")[1].length;
if(s2.indexOf('.')>=0)t2 = s2.split(".")[1].length;
r1=Number(s1.replace('.',''))
r2=Number(s2.replace('.',''))
return (r1/r2)*Math.pow(10,t2-t1);
};
//乘法
Number.prototype.mul = function (arg){
if(!/\./.test(this) && !/\./.test(arg)){
return this*arg;
}
var arg1 = this;
var arg2 = arg;
var m=0,s1=arg1.toString(),s2=arg2.toString();
if(s1.indexOf('.')>=0)m+=s1.split(".")[1].length;
if(s2.indexOf('.')>=0)m+=s2.split(".")[1].length;
return Number(s1.replace(".",""))*Number(s2.replace(".",""))/Math.pow(10,m);
};
//加法
Number.prototype.add = function (arg){
if(!/\./.test(this) && !/\./.test(arg)){
return this+arg;
}
var arg2 = this;
var arg1 = arg;
var r1,r2,m;
try{r1=arg1.toString().split(".")[1].length}catch(e){r1=0}
try{r2=arg2.toString().split(".")[1].length}catch(e){r2=0}
m=Math.pow(10,Math.max(r1,r2))
return (arg1*m+arg2*m)/m;
};
hack后的demo:http://www.uedmagazine.com/test/js_float_2.html
hack后的总执行时间大概是400毫秒左右,实际执行情况视客户端机器情况,一般而言比原生乘除慢一倍时间,不过也是可容忍的。
ps:有时对算法效率有要求的时候,多使用判断和存储,用简单语句代替长难句,原则无非是用空间换时间,以赢得更快的速度。以上。
猜你喜欢
- 我就废话不多说了,大家还是直接看代码吧!import kerasfrom keras.datasets import cifar10from
- 前言sort包中实现了3种基本的排序算法:插入排序.快排和堆排序.和其他语言中一样,这三种方式都是不公开的,他们只在sort包内部使用.所以
- numpy.flip(m, axis=None)Reverse the order of elements in an array alon
- # set 不支持索引和切片,是一个无需的不重复得到容器# 类似于字典,但是只有key 没有value# 创建集合dic1={}set1={
- JSP 注释的详解及简单实例一 三种格式二 举例 <body> <h1>大家好</h1
- 在进行浮动布局时,大多数人都深知,在必要的地方进行浮动清理:<div style="clear:both;">
- 大家提供了许多linux开代理的方法,一般用到python等语言,一些服务器可能不会安装,然而perl可以说是linux标配的语言,给大家一
- 一、背景大家好,我是J哥。也许你还记得,前不久复旦大学一博士生写了130行Python代码,批量识别核酸截图内容的故事。当时还被人民日报公众
- 01 创建不可见列创建不可见列:CREATE TABLE `t2` ( `id`&nbs
- 最近由于经常要用到Excel,需要根据Excel表格中的内容对一些apk进行处理,手动处理很麻烦,于是决定写脚本来处理。首先贴出网上找来的读
- 1. 环境准备1.1 安装pillow 和 pytesseractpython模块库需要 pillow 和 pytesseract 这两个库
- 按下"开始(win)"按钮和R键,输入cmd,打开命令行寻找点击需要的库:https://www.lfd.uci.edu
- 本文给大家介绍vue2.0+webpack环境构造过程。1.首先新建一个目录vue-wkdemo,这是我们的项目目录。执行 npm init
- 介绍获取协程返回值的四种方式:1、通过ensure_future获取,本质是future对象中的result方2、使用loop自带的crea
- setuptools模块和pip模块是python进行第三方库扩展的极重要工具,例如我们在需要安装一些爬虫或者数据分析的包时就可以使用pip
- 对我当前工程进行全部测试需要花费不少时间。既然有 26 GB 空闲内存,为何不让其发挥余热呢? tmpfs 可以通过把文件系统保
- 本文实例讲述了Python网络编程使用select实现socket全双工异步通信功能。分享给大家供大家参考,具体如下:在前面一篇《Pytho
- 本文实例主要是实现爬取一个网页上的图片地址,具体如下。读取一个网页的源代码:import urllib.requestdef getHtml
- “没 Javascript 就会死”的页面通常都会加入 noscript 标签用于提示用户开启脚本支持。 然而在 IE8 下,如果在 nos
- 官方文档中关于super的定义说的不是很多,大致意思是返回一个代理对象让你能够调用一些继承过来的方法,查找的机制遵循mro规则,最常用的情况