javascript小数相减会出现一长串的小数位数的原因

javascript小数相减会出现一长串的小数位数的原因

<script>

var a=‘38.8‘;

var b=‘6.8‘;

alert(parseFloat(a)-parseFloat(b));

var a=134.22;

var b=6;

alert(a*b);

</script>

以上代码为什么产生一长串小数位出来,虽然比较精确,可没必要呀。

这个和数据结构有关系,整数型自动转换成正型计算,小数型直接转成double型计算。这是在内存中运算的时候必须这样,你该知道计算机只认识0和1吧,具体的就是浮点精准度的问题。

float 精确到小数点后7位

double 精确到小数点后15位

javascript:document.write( (11.3-10.1).toFixed(2) )

toFixed()方法不仅仅截去多余的小数位,同时它还根据截取位置的下一个小数位进行四舍五入。例如,对于数值10.739,截取到小数点后的两位数,结果将是10.74。而对于数值10.732,截取到小数点后的两位数,结果将是10.73。

注意,在JavaScript中我们只能截取小数点之后0位~20位的小数。

toFixed()方法仅被高版本的浏览器所支持,所以在使用之前最好先检查一下浏览器是否支持该方法,检查的代码如下所示:

var varNumber = 22.234;

if (varNumber.toFixed)

{

varNumber = varNumber.toFixed(2);

}

else //浏览器不支持toFixed()就使用其他方法

{

var div = Math.pow(10,2);

varNumber = Math.round(varNumber * div) / div;

}

这样可以解决,但你想问,怎么可能多出这么小数点出来。

为什么会出现如此无法理解的答案?

我Google了一下,发现原来这是JavaScript浮点运算的一个bug。

比如:7*0.8 JavaScript算出来就是:5.6000000000000005

网上找到了一些解决办法,就是重新写了一些浮点运算的函数。

下面就把这些方法摘录下来,以供遇到同样问题的朋友参考:

程序代码

//除法函数,用来得到精确的除法结果

//说明:javascript的除法结果会有误差,在两个浮点数相除的时候会比较明显。这个函数返回较为精确的除法结果。

//调用:accDiv(arg1,arg2)

//返回值:arg1除以arg2的精确结果

function accDiv(arg1,arg2){

var t1=0,t2=0,r1,r2;

try{t1=arg1.toString().split(".")[1].length}catch(e){}

try{t2=arg2.toString().split(".")[1].length}catch(e){}

with(Math){

r1=Number(arg1.toString().replace(".",""))

r2=Number(arg2.toString().replace(".",""))

return (r1/r2)*pow(10,t2-t1);

}

}

//给Number类型增加一个div方法,调用起来更加方便。

Number.prototype.div = function (arg){

return accDiv(this, arg);

}

//乘法函数,用来得到精确的乘法结果

//说明:javascript的乘法结果会有误差,在两个浮点数相乘的时候会比较明显。这个函数返回较为精确的乘法结果。

//调用:accMul(arg1,arg2)

//返回值:arg1乘以arg2的精确结果

function accMul(arg1,arg2)

{

var m=0,s1=arg1.toString(),s2=arg2.toString();

try{m+=s1.split(".")[1].length}catch(e){}

try{m+=s2.split(".")[1].length}catch(e){}

return
Number(s1.replace(".",""))*Number(s2.replace(".",""))/Math.pow(10,m)

}

//给Number类型增加一个mul方法,调用起来更加方便。

Number.prototype.mul = function (arg){

return accMul(arg, this);

}

//加法函数,用来得到精确的加法结果

//说明:javascript的加法结果会有误差,在两个浮点数相加的时候会比较明显。这个函数返回较为精确的加法结果。

//调用:accAdd(arg1,arg2)

//返回值:arg1加上arg2的精确结果

function accAdd(arg1,arg2){

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

}

//给Number类型增加一个add方法,调用起来更加方便。

Number.prototype.add = function (arg){

return accAdd(arg,this);

}

在你要用的地方包含这些函数,然后调用它来计算就可以了。

比如你要计算:7*0.8 ,则改成 (7).mul(8)

其它运算类似,就可以得到比较精确的结果。

--------------------------------------------------------------------------

以上是在网上一个JS牛人的博客上转载的,不过上面只提及了加法、乘法和除法的解决办法。

这个时候可能很多人就会想,有了加法,减法还不容易?我就是差点让这个想法给害苦了。

其他的就不多说了,帖出减法的代码:

function Subtr(arg1,arg2){

var r1,r2,m,n;

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));

//last modify by deeka

//动态控制精度长度

n=(r1>=r2)?r1:r2;

return ((arg1*m-arg2*m)/m).toFixed(n);

}

原文:http://blog.sina.com.cn/s/blog_8deabceb01017b7k.html

javascript小数相减会出现一长串的小数位数的原因

时间: 2024-10-01 06:39:55

javascript小数相减会出现一长串的小数位数的原因的相关文章

javascript日期相减,求时间差

//计算时间差 var from_date = new Date(from_time); var end_date = new Date(end_time); var time_different = (end_date - from_date) / 86400000; //也就是24*60*60*1000 单位是毫秒 /* if(time_different > 365){ alert('时间跨度不能超过一年'); } */javascript日期相减,求时间差

javascript小数相减出现一长串的小数位数

我们要修改网页某个数据的显示格式,需要两步操作: 1.在JS中通过$('.class1 .class2 li:eq(2) span.value').text().trim();类似的语句获取到数据内容. 2.将数据修改成需要的格式.(eg:data=10  ==>  9+1) 如果我们拿到的data值是整数,那么没问题,事情会进展的很顺利,跟预期的结果一样. 但是如果带小数的话,问题就来了. 这是为什么呢? 答:这个和数据结构有关系,整数型自动转换成正型计算,小数型直接转成double型计算,这

javascript浮点数相减、相乘出现一长串小数

149.7 * 100 = 14969.999999999998 3.57 - 2.33 = 1.2399999999999998 原文地址:https://www.cnblogs.com/wujinhong/p/12667836.html

JS中小数相加相减时出现很长的小数点的解决方式

1.问题: 平时写的代码中会出现这种情况,parseFloat(11.3-10.1) 运行的结果依然是1.200000000000001 代码示例: var arr = [0.0111,11.002,0.3,1.5,1.61] var total = 0 arr.forEach(item =>{ total += item }) console.log(total) 返回的结果---  14.423100000000002,这种情况就不合常理. 2.解决方案: 这里有一种可行的解决方法,应用到M

js面试题--------JS中数字和字符,布尔类型相加相减问题

JS中数字和字符相加相减问题 <html lang="en"> <head> <meta charset="utf-8" /> <title></title> </head> <body> </body> </html> <script type="text/javascript"> var a = 100; var b = &

【转】实现Sqlite datediff日期时间相减的方法

对sqlite既恨又爱,在小项目里,用sqlite开发起来非常方便,效率足够用.美中不足的是sqlite精简了些功能及相关函数.如存储过程,datediff,不支持并发写入及远程访问(或许有些高手说这个不是问题,用共享或iis都可以解决,但这算真正解决吗?),导致在开发过程中走了不少弯路. 最常用到的日期及时间比较函数datediff,在sqlite里被精简了,网上也找不到详细的的实现方法.今天就花了点时间来自己实现datediff功能. 折腾一段时间后发现sqlite里有个julianday函

JS时间(日期)比较或相减

注:此文均来自网上,可行,只供参考 //JAVASCRIPT中 日期相减很麻烦 ,现在有现成的实现方法,拷贝过去就可以用了,方便 //调用该方法(主方法) function dateDiff(date1, date2){     var type1 = typeof date1, type2 = typeof date2;     if(type1 == 'string')     date1 = stringToTime(date1);     else if(date1.getTime)  

C语言复习---获取最大公约数(辗转相除法和更相减损法)

源自:百度百科 辗转相除法 辗转相除法:辗转相除法是求两个自然数的最大公约数的一种方法,也叫欧几里德算法. 例如,求(319,377): ∵ 319÷377=0(余319) ∴(319,377)=(377,319): ∵ 377÷319=1(余58) ∴(377,319)=(319,58): ∵ 319÷58=5(余29) ∴ (319,58)=(58,29): ∵ 58÷29=2(余0) ∴ (58,29)= 29: ∴ (319,377)=29. 用辗转相除法求几个数的最大公约数,可以先求出

求两个数的最大公约数,辗转相除法与更相减损法(递归迭代)

问题:给出两个数a和b,求出他们的最大公约数(greatest common divisor). 解法一:辗转相除法,又叫欧几里得算法.两个正整数a和b(a>b),他们的最大公约数等于a除以b的余数和b之间的最大公约数. 比如10和25,25除以10余5,那么10和25的最大公约数等同于5和10之间的最大公约数. //辗转相除法 递归解法 int gcd(int a,int b){ if(a%b==0) return b; return (b,a%b); } //辗转相除法 迭代解法int gc