由toFixed带来的潜在问题,您注意到了吗

转载 2012年03月28日 09:30:21
我相信大家在写脚本处理数字的时候肯定会经常用到toFixed方法。

     一、toFixed能做什么?

以下是摘自网络的toFixed的介绍:

toFixed 方法:

返回一个字符串,代表一个以定点表示法表示的数字。

numObj.toFixed([fractionDigits])

参数

numObj

必选项。一个 Number 对象。

fractionDigits

可选项。小数点后的数字位数。其值必须在 0 – 20 之间,包括 0 和 20。

说明

toFixed 方法返回一个以定点表示法表示的数字的字符串形式。该字符串中小数点之前有一位有效数字,而且其后必须包含 fractionDigits 数字。

如果没有 fractionDigits 参数,或者该参数为 undefinedtoFixed 方法假定该值为 0。

二、toFixed可以四舍五入吗?

     答案是可以。但是问题也正在于此。这种四舍五入是不稳定的(不同的浏览器不一样)。

     (1).

 

     在ie7下点击按钮会显示0.00,而ff会是0.01。

    (2) 

     ie和ff都正常。

     可见对于ie而言有一部分数字在使用toFixed时是不能得到正确的四舍五入的结果的。这个问题可能很多朋友都没有意识到,而这个问题说小也小,但有时候却也会带来恶劣的后果。

     就像上面0.009.toFixed(2)这个例子(0.009是一系列处理后的结果),恰好我就遇上了。在一个页面当中因为是在后台代码中做的计算因此显示为1%,而在另一个页面因为使用了toFixed结果显示为0%。为此被客户批了一顿。

     OK,既然有这样的问题,又怎么解决呢?

三、替代方案:

     正如很多朋友所想,我们可以重写这个方法:

     Number.prototype.toFixed = function( fractionDigits )...

     下面给出一个简陋的解决方案:

JS <wbr>Tips(4)鈥斢蓆oFixed带来的潜在问题,您注意到了吗JS <wbr>Tips(4)鈥斢蓆oFixed带来的潜在问题,您注意到了吗Code
Number.prototype.toFixed = function( fractionDigits )
{
    
//没有对fractionDigits做任何处理,假设它是合法输入
    return (parseInt(this * Math.pow( 10, fractionDigits  ) + 0.5)/Math.pow(10,fractionDigts)).toString();
}

覆写toFixed后的显示例子如下:

JS <wbr>Tips(4)鈥斢蓆oFixed带来的潜在问题,您注意到了吗JS <wbr>Tips(4)鈥斢蓆oFixed带来的潜在问题,您注意到了吗Code
<html>
<head>
<script type="text/javascript">
Number.prototype.toFixed 
= function(s)
{
    
return (parseInt(this * Math.pow( 10, s ) + 0.5)/ Math.pow( 10, s )).toString();
}
</script>
</head>
<body>
<input onclick="alert(0.009.toFixed(2))" type="button" value="显示0.009.toFixed(2)"> 
</body>
</html>

 

OK,问题解决了。

ultraEdit 给您带来不便,我们深感抱歉 但是,您的激活存在问题!

给您带来不便,我们深感抱歉 但是,您的激活存在问题! 解决方法 1.完全卸载UltraEdit  2.删除系统盘下的uedit32.spl 该文件的路径 %ProgramData%\IDMC...
  • qykshr
  • qykshr
  • 2014年04月16日 21:32
  • 4999

js处理小数 , toFixed()的潜在问题

一、toFixed能做什么? 以下是摘自网络的toFixed的介绍: toFixed 方法: 返回一个字符串,代表一个以定点表示法表示的数字。 numObj.toFixed([fractionD...
  • zhouchao001
  • zhouchao001
  • 2015年12月13日 17:37
  • 9415

JS中toFixed()方法引起的精度丢失的问题解决

JS中toFixed()方法的问题及解决方案 最近发现JS当中toFixed()方法存在一些问题,采用原生的Number对象的原型对象上的toFixed()方法时,规则并不是所谓的“四舍五入...
  • langqiao123
  • langqiao123
  • 2014年12月26日 16:47
  • 1946

JS Tips(4)—由toFixed带来的潜在问题,您注意到了吗

我相信大家在写脚本处理数字的时候肯定会经常用到toFixed方法。      一、toFixed能做什么? 以下是摘自网络的toFixed的介绍: toFixed 方法: 返回一个字符串,...
  • wsxsom
  • wsxsom
  • 2014年08月11日 14:35
  • 471

自定义ItemDecoration这个问题你真的注意到了吗

自定义ItemDecoration
  • u013651026
  • u013651026
  • 2017年12月19日 13:06
  • 99

bash的基础用法,你注意到了吗?

${parameter##word}               The word is expanded to produce a pattern just as in pathname expa...
  • zhuying_linux
  • zhuying_linux
  • 2011年11月16日 11:53
  • 1092

淘宝网店装修,这些细节你注意到了吗?

虽然我们常说,店铺装修要有自己的风格特点,但是也不能太标新立异,脱离了主流。当下活跃在淘宝的多是年轻人,所以绚丽的元素肯定是会多一些,这样产生的视觉效果很好,但是我们在装修时也不能只顾着色彩的搭配这个...
  • longdaqing123
  • longdaqing123
  • 2016年12月14日 11:20
  • 176

运算放大器电路设计知识你注意到了吗

运算放大器算是很常见的一种器件了。以下为运放电路设计中容易出现的问题和合适的解决方案,希望对大家有所启发,共同提高!   偏置电流如何补偿   对于我们常用的反相运算放大器,其典型电路如下:  ...
  • cfxzy
  • cfxzy
  • 2014年12月17日 21:39
  • 967

单实例,多实例!框架中你们注意到这个问题了吗?

Servlet/JSP技术和ASP、PHP等相比,由于其多线程运行而具有很高的执行效率。由于Servlet/JSP默认是以多线程模式执行的,所以,在编写代码时需要非常细致地考虑多线程的安全性问题。然而...
  • Serenada
  • Serenada
  • 2012年05月09日 14:04
  • 2598

用NSAttributedString实现简单的图文混排-----(确实几个需要注意的地方都注意到了就好了。)

iOS7以后,因为TextKit的强大,可以用NSAttributedString很方便的实现图文混排(主要是利用了NSTextAttachment)。 关于Textkit的牛逼之处,可以参考o...
  • cos_sin_tan
  • cos_sin_tan
  • 2017年04月26日 19:55
  • 302
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:由toFixed带来的潜在问题,您注意到了吗
举报原因:
原因补充:

(最多只允许输入30个字)