`

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()方法引起的问题如何解决

    为了解决这个问题,可以考虑重写`Number.prototype.toFixed()`方法,以确保其始终按照期望的“四舍五入”规则执行。以下是一个可能的解决方案: ```javascript (function() { var originalToFixed = Number....

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

    在讨论JavaScript中的toFixed方法时,我们经常...随后,提出了一种通过重写toFixed方法来解决此问题的解决方案,并且给出了一个具体的代码示例。在实际应用中,应当注意测试与兼容性问题,以确保代码的可靠性和稳定性。

    Javascript中 toFixed四舍六入方法

    在JavaScript中,`toFixed()`方法是用来处理浮点数精度问题的一个关键工具,它遵循特定的舍入策略,即银行家舍入法。银行家舍入法是一种公平的舍入策略,旨在避免在大量数据处理中偏向某一边的舍入误差积累。在...

    js toFixed()方法的重写实现精度的统一

    在实际应用中,开发者需要注意的是,尽管重写toFixed()方法可以解决一些兼容性问题,但它并不改变原生的toFixed()方法的行为,且会增加额外的计算复杂性。因此,在使用时需要权衡利弊,并确保在项目中的应用不会带来...

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

    总的来说,当在Vue中需要保留两位小数时,应避免直接在模板中使用`toFixed(2)`,而是使用自定义过滤器或在`methods`中定义的方法来处理数字,确保数据类型的一致性,从而避免Vue的更新循环问题。同时,根据项目的...

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

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

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

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

    JS中乘法的浮点错误解决方法

    这是最直观的解决方法,即先将参与运算的浮点数乘以一个较大的整数,然后进行计算,最后再除以相同的倍数。例如,`11 * (22.9 * 10) / 10`,通过这种方式,我们可以避免浮点误差,得到251.9的结果。 2. **自定义...

    js保留两位小数使用toFixed实现

    为了解决这个问题,JavaScript提供了一个名为`Number.toFixed()`的方法,它可以帮助我们以指定的小数位数格式化数字。`toFixed()`方法接受一个参数,即你希望保留的小数位数。在你的例子中,如果你使用`(0.9996*100)...

    JS精度计算1、转成整数计算再转换成小数,2、toFixed,3、math.js,4、bignumber.js,5、big.js

    为了解决这个问题,有几种不同的策略和技术可以使用。以下是对标题和描述中提到的知识点的详细解释: 1. **转成整数计算再转换成小数** 当涉及到涉及精度的数学运算时,一个常见方法是将数值转换为整数,进行计算...

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

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

    js计算精度问题解决方案

    解决JavaScript计算精度问题的方法有多种: 1. **四舍五入**:使用`toFixed(n)`方法可以将数值转换为带有指定小数位数的字符串,但要注意,这并不是真正的计算,而是在结果上应用了四舍五入规则。例如,`(0.1 + 0.2...

    详解JavaScript中精度失准问题及解决方法

    在探讨JavaScript中精度失准问题及其解决方法之前,首先需要了解JavaScript中数字类型的存储情况。JavaScript中所有的数字,无论是小数还是整型,都被存储为浮点数类型。在内部,这些数字是通过64位浮点数(也被称为...

    解决JS浮点数(小数)计算加减乘除的BUG

    本文将深入探讨这个问题,并提供解决方案。 首先,我们需要理解JavaScript中的浮点数是如何存储的。JavaScript使用IEEE 754标准来表示浮点数,这个标准在计算机科学中广泛使用。然而,它并不总是能够精确地表示所有...

    js代码-toFixed验证

    JavaScript 中的浮点数运算存在精度问题,`toFixed()` 不能解决这个问题,但可以用来格式化显示。如果需要精确计算,可以使用`BigInt`或者`decimal.js`等库。 6. `toFixed()` 在实际开发中的应用 - 价格显示:在...

    javascript小数精度丢失的完美解决方法.docx

    ### JavaScript小数精度丢失的完美解决方法 #### 引言 在JavaScript中处理浮点数时,经常会遇到小数精度丢失的问题。这是由于JavaScript内部使用的是64位浮点数格式(即IEEE 754标准)来表示数值,而这种格式在...

Global site tag (gtag.js) - Google Analytics