一. toFixed问题
发现在chrome里面0.725.toFixed() = 0.72,在IE下是0.73。
二. 网上大牛解决方法
网上大牛重写Number的toFixed方法。
网址: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);
相关推荐
为了解决这个问题,可以考虑重写`Number.prototype.toFixed()`方法,以确保其始终按照期望的“四舍五入”规则执行。以下是一个可能的解决方案: ```javascript (function() { var originalToFixed = Number....
在讨论JavaScript中的toFixed方法时,我们经常...随后,提出了一种通过重写toFixed方法来解决此问题的解决方案,并且给出了一个具体的代码示例。在实际应用中,应当注意测试与兼容性问题,以确保代码的可靠性和稳定性。
在JavaScript中,`toFixed()`方法是用来处理浮点数精度问题的一个关键工具,它遵循特定的舍入策略,即银行家舍入法。银行家舍入法是一种公平的舍入策略,旨在避免在大量数据处理中偏向某一边的舍入误差积累。在...
在实际应用中,开发者需要注意的是,尽管重写toFixed()方法可以解决一些兼容性问题,但它并不改变原生的toFixed()方法的行为,且会增加额外的计算复杂性。因此,在使用时需要权衡利弊,并确保在项目中的应用不会带来...
总的来说,当在Vue中需要保留两位小数时,应避免直接在模板中使用`toFixed(2)`,而是使用自定义过滤器或在`methods`中定义的方法来处理数字,确保数据类型的一致性,从而避免Vue的更新循环问题。同时,根据项目的...
0.009.toFixed(2)本该返回0.01的结果,可它却返回了一个0.00,这是这个方法的一个BUG,且这个方法对客户端的JS版本要求有点偏高,至少在IE5.0里这个方法用不起来,所以我写了上面的一段修正代码,并且还解决了这个...
定义一个方法 towNumber(val) { return val.toFixed(2) } 使用 {{ towNumber(row.equiValue) }} 补充知识:vue中提示toFixed不是函数 vue中toFixed获取小数点后两位 错误提示: .toFixed is not a function ...
这是最直观的解决方法,即先将参与运算的浮点数乘以一个较大的整数,然后进行计算,最后再除以相同的倍数。例如,`11 * (22.9 * 10) / 10`,通过这种方式,我们可以避免浮点误差,得到251.9的结果。 2. **自定义...
为了解决这个问题,JavaScript提供了一个名为`Number.toFixed()`的方法,它可以帮助我们以指定的小数位数格式化数字。`toFixed()`方法接受一个参数,即你希望保留的小数位数。在你的例子中,如果你使用`(0.9996*100)...
为了解决这个问题,有几种不同的策略和技术可以使用。以下是对标题和描述中提到的知识点的详细解释: 1. **转成整数计算再转换成小数** 当涉及到涉及精度的数学运算时,一个常见方法是将数值转换为整数,进行计算...
JS 中小数运算(加、减、乘、除)的问题及一些数学函数 ...* 使用整数运算、toFixed()方法、Math.round()方法等可以解决小数运算的精度问题。 * 数学函数可以分为常数、乘方函数、三角函数、舍入函数、随机数字等几类。
解决JavaScript计算精度问题的方法有多种: 1. **四舍五入**:使用`toFixed(n)`方法可以将数值转换为带有指定小数位数的字符串,但要注意,这并不是真正的计算,而是在结果上应用了四舍五入规则。例如,`(0.1 + 0.2...
在探讨JavaScript中精度失准问题及其解决方法之前,首先需要了解JavaScript中数字类型的存储情况。JavaScript中所有的数字,无论是小数还是整型,都被存储为浮点数类型。在内部,这些数字是通过64位浮点数(也被称为...
本文将深入探讨这个问题,并提供解决方案。 首先,我们需要理解JavaScript中的浮点数是如何存储的。JavaScript使用IEEE 754标准来表示浮点数,这个标准在计算机科学中广泛使用。然而,它并不总是能够精确地表示所有...
JavaScript 中的浮点数运算存在精度问题,`toFixed()` 不能解决这个问题,但可以用来格式化显示。如果需要精确计算,可以使用`BigInt`或者`decimal.js`等库。 6. `toFixed()` 在实际开发中的应用 - 价格显示:在...
### JavaScript小数精度丢失的完美解决方法 #### 引言 在JavaScript中处理浮点数时,经常会遇到小数精度丢失的问题。这是由于JavaScript内部使用的是64位浮点数格式(即IEEE 754标准)来表示数值,而这种格式在...