`

toFixed问题及解决方法

阅读更多

一.   toFixed问题

发现在chrome里面0.725.toFixed() = 0.72,在IE下是0.73

 

二.   网上大牛解决方法

网上大牛重写NumbertoFixed方法。

网址:http://stackoverflow.com/questions/10470810/javascript-tofixed-bug-in-ie6

Number.prototype.toFixed = function(n) {
    var power = Math.pow(10, n);
    var fixed = (Math.round(this * power) / power).toString();
    if(n == 0) return fixed;
    if(fixed.indexOf('.') < 0) fixed += '.';
    var padding = n + 1 - (fixed.length - fixed.indexOf('.'));
    for(var i = 0; i < padding; i++) fixed += '0';
    return fixed;
};

        0.725.toFixed(2)=0.73

       298561.7249999999999999.toFixed(2)=298561.72

       发现298561.725.toFixed(2)=298561.72还是不对。

 

三.   彻底解决方法

<html>  
<head></head>  
<script>  
/**   
* 浮点数乘法运算   
* @param {number} arg1 乘数   
 * @param {number} arg2 被乘数   
* @example   
 * Math.floatMul(11.1, 77.7)   
 * 其形式等同于 (11.1 * 77.7) 但不存在 JS 丢失精度的问题   
 * 如3.69 * 258.258   
 */   
Math.floatMul = function(arg1, arg2) {    
         var m=0, s1=arg1.toString(), s2=arg2.toString();
         if(s1.indexOf('.') != -1)
                   m += s1.split('.')[1].length;
         if(s2.indexOf('.') != -1)
                   m += s2.split('.')[1].length;
         return Number(s1.replace('.', '')) * Number(s2.replace('.', '')) / Math.pow(10, m);
};

/**   
* 浮点数除法运算   
* @param {number} arg1 除数   
 * @param {number} arg2 被除数   
* @example   
 * Math.floatDiv(11.1, 77.7)   
 * 其形式等同于 (11.1/77.7) 但不存在 JS 丢失精度的问题   
 * 如3.69 / 258.258
 */   
Math.floatDiv = function(arg1, arg2) {    
         var t1=0, t2=0, r1, r2, s1=arg1.toString(), s2=arg2.toString();    
         if(s1.indexOf('.') != -1)
                   t1 = s1.split('.')[1].length;
         if(s2.indexOf('.') != -1)
                   t2 = s2.split('.')[1].length;

         r1 = Number(s1.replace('.', ''));
         r2 = Number(s2.replace('.', ''));
         return (r1 / r2) / Math.pow(10, t1 - t2);
};
/**   
 * 浮点数加法运算      
 *   
 * @param {number} arg1 加数   
 * @param {number} arg2 被加数   
 *   
 * @example   
 * Math.floatAdd(11.1, 77.7)   
 * 其形式等同于 (11.1 + 77.7) 但不存在 JS 丢失精度的问题   
 * 如694.84 + (-300)   
 */   
Math.floatAdd = function(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;   
};   

/**   
 * 浮点数减法运算      
 *   
 * @param {number} arg1 减数   
 * @param {number} arg2 被减数   
 *   
 * @example   
 * Math.floatSub(11.1, 77.7)   
 * 其形式等同于 (11.1 - 77.7) 但不存在 JS 丢失精度的问题   
 * 如694.84 - 300  
 */   
Math.floatSub = function(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));   
         // use accurate one
         n = (r1 >= r2) ? r1 : r2;   
         return (((arg1 * m) - (arg2 * m)) / m).toFixed(n);   
};
//http://stackoverflow.com/questions/10470810/javascript-tofixed-bug-in-ie6
Number.prototype.toFixed = function(n) {
    var power = Math.pow(10, n);
    var fixed = (Math.round(Math.floatMul(this, power)) / power).toString();
    if (n == 0)
        return fixed;
    if (fixed.indexOf('.') < 0)
        fixed += '.';
    var padding = n + 1 - (fixed.length - fixed.indexOf('.'));
    for (var i = 0; i < padding; i++)
        fixed += '0';
    return fixed;
};

/**
 * 计算方法 
 */   
function calculate(){   
    var v1 = document.getElementById('txt1').value - 0;   
    var v2 = document.getElementById('txt2').value - 0;   
    var v = v1.toFixed(v2);   
    alert(v1 + '.toFixed(' + v2 + ') = ' + v);   
}
</script>
  
<body>  
    <div>
    	<span>原值:</span>
    	<input id="txt1" /><br/>  
    </div>
    <div>
    	<span>保留小数位数:</span>
    	<input id="txt2" value="2"/>
    </div>
    <input type="button" value="计算" onclick="calculate()" />  
</body>  
</html>

       运行结果都OK




    有问题的测试结果


    跟踪发现:

如下四种获取v1值的方法,298561.7249999999999999的结果都是298561.725

var v1 = parseFloat(document.getElementById('txt1').value);
var v1 = Number(document.getElementById('txt1').value);
var v1 = document.getElementById('txt1').value - 0;
var v1 = Math.floatAdd(document.getElementById('txt1').value,0);
  • 大小: 28.7 KB
  • 大小: 28.7 KB
  • 大小: 43 KB
  • 大小: 24.2 KB
  • 大小: 29 KB
  • 大小: 18 KB
  • 大小: 8.4 KB
分享到:
评论

相关推荐

    JS中toFixed()方法引起的问题如何解决

    最近发现JS当中toFixed()方法存在一些问题,采用原生的Number对象的原型对象上的toFixed()方法时,规则并不是所谓的“四舍五入”或者是四舍六入五成双

    Javascript中 toFixed四舍六入方法

    但是不论引入toFixed解决浮点数计算精度缺失的问题也好,它有没有使用银行家舍入法也罢,都是为了解决精度的问题,但是又离不开二进制浮点数的环境,但至少他帮助我们找到了问题所在,从而让我们有解决方法。...

    Javascript中toFixed计算错误(依赖银行家舍入法的缺陷)解决方法

    为了解决上述问题,使用了toFixed方法却出现了浮点数小数位以5结尾的四舍五入错误问题; var num = 0.045; console.log(num.toFixed(2)); 0.04 以此为起点,引发了我关于toFixed的一系列探索,终于找到了一些有用的...

    javascript之对系统的toFixed()方法的修正

    0.009.toFixed(2)本该返回0.01的结果,可它却返回了一个0.00,这是这个方法的一个BUG,且这个方法对客户端的JS版本要求有点偏高,至少在IE5.0里这个方法用不起来,所以我写了上面的一段修正代码,并且还解决了这个...

    vue 保留两位小数 不能直接用toFixed(2) 的解决

    刚开始我是用toFixed()这个方法来写的 效果是有的 但是控制台一直是红红的围绕着我 突然想到 vue和jquery混搭 的 问题 于是乎 看了一下vue的开发文档 发现过滤器这个东东 并且可以自定义过滤器 js代码 html代码 ...

    Vue toFixed保留两位小数的3种方式

    定义一个方法 towNumber(val) { return val.toFixed(2) } 使用 {{ towNumber(row.equiValue) }} 补充知识:vue中提示toFixed不是函数 vue中toFixed获取小数点后两位 错误提示: .toFixed is not a function ...

    js中小数运算(加、减、乘、除)的问题及一些数学函

    JS 中小数运算(加、减、乘、除)的问题及一些数学函数 ...* 使用整数运算、toFixed()方法、Math.round()方法等可以解决小数运算的精度问题。 * 数学函数可以分为常数、乘方函数、三角函数、舍入函数、随机数字等几类。

    解决JavaScript数字精度丢失问题的方法

    解决方案(一个对象+一个函数) 一、JS数字精度丢失的一些典型问题 1. 两个简单的浮点数相加 0.1 + 0.2 != 0.3 // true 这真不是 Firebug 的问题,可以用alert试试 (哈哈开玩笑)。 看看Java的运算结果 再看看...

    JS处理数据四舍五入(tofixed与round的区别详解)

    1 、tofixed方法 toFixed() 方法可把 Number 四舍五入为指定小数位数的数字。...为了解决这样的问题,可以自定义去使用Math.round方法进行自定义式 的实现指定保留多少位数据进行处理。 定义和用法 toFi

    round-tofixed:正确将JavaScript数字四舍五入到固定的小数位数

    圆角固定的正确将JavaScript数字四舍五入到固定的小数位数概述round-tofixed解决了在JavaScript中舍入十进制数字时的常见问题: Math.round()内置函数只能四舍五入为整数常用的十进制数字舍入方法会产生错误的结果...

    js数字舍入误差以及解决方法(必看篇)

    3、解决方法 (1)toFixed(),存在兼容性(chrome) (2)比较稳妥方法(数字如果过大,也会有误差): *JS 中能精准表示的最大整数是 Math.pow(2, 53),十进制即 9007199254740992。 大于 9007199254740992 的可能会...

    JS用最简单的方法实现四舍五入

    1 、tofixed方法 toFixed() 方法可把 Number 四舍五入为指定小数位数的数字。...为了解决这样的问题,可以自定义去使用Math.round方法进行自定义式 的实现指定保留多少位数据进行处理。 2 、round方法

    float_calculate:解决浮点数精度计算问题

    为啥会封装了 js自带的方法toFixed() 举个:chestnut: 3.55保留一位小数,用原生的会是 3.55.toFixed(1) 预期 3.6 实际 3.5加法 Add()、 减法 Sul()、 乘法 Mul()、 除法 Div() 全部接受两个参数 比如 3 - 2 Sul(3, 2)

    Javascript浮点数乘积运算出现多位小数的解决方法

    Javascript在进行浮点数的乘积运算,会出现多位小数的... 1000 =1111101000 1038.1转化为二进制是个无限循环小数,1100是循环节,只能取近似值,误差就是这里产生的 如果浏览器版本高,可以用toFixed() 方法可把 Numb

    js小数运算出现多位小数如何解决

    10.22 现在要减去 0.11 结果值又出现了很多的小数 10.110000000000001,然后我就用了 toFixed 方法来过滤小数,但是不知道跟前面那种转换成整数后再执行哪种效率高,好!还是试下再说吧! var date1 = new Date();...

    JavaScript笔记

    |--x.toFixed(num):可把Number四舍五入为指定小数位数(num:0-20)的数字 |--x.toString():用于把一个 Number 对象转换为一个字符串,并返回结果 19.正则表达式对象:(专门用于查找和验证) reg.test(‘要验证的完整...

Global site tag (gtag.js) - Google Analytics