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

一、toFixed能做什么? 

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

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

numObj.toFixed([fractionDigits]) 

参数 
numObj 
必选项。一个 Number 对象。 

fractionDigits 

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

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

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

二、toFixed可以四舍五入吗? 

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

     (1).

Html代码   收藏代码
  1. <input onclick="alert(0.009.toFixed(2))" type="button" value="显示0.009.toFixed(2)">  



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

    (2)

Html代码   收藏代码
  1. <input onclick="alert(0.097.toFixed(2))" type="button" value="显示0.097.toFixed(2)">  



     ie和ff都正常。 

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

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

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

三、替代方案: 

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

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

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

Js代码   收藏代码
  1. Number.prototype.toFixed = function( fractionDigits )  
  2. {  
  3.     //没有对fractionDigits做任何处理,假设它是合法输入  
  4.     return (parseInt(this * Math.pow( 10, fractionDigits  ) + 0.5)/Math.pow(10,fractionDigts)).toString();  
  5. }  


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

Html代码   收藏代码
  1. <html>  
  2. <head>  
  3. <script type="text/javascript">  
  4. Number.prototype.toFixed = function(s)  
  5. {  
  6.     return (parseInt(this * Math.pow( 10, s ) + 0.5)/ Math.pow( 10, s )).toString();  
  7. }  
  8. </script>  
  9. </head>  
  10. <body>  
  11. <input onclick="alert(0.009.toFixed(2))" type="button" value="显示0.009.toFixed(2)">   
  12. </body>  
  13. </html>  




OK,问题解决了。 

转载于:https://www.cnblogs.com/52java/archive/2013/05/28/3103315.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值