<javascript>Number.prototype.toFixed小记
2017-05-12 17:45
441 查看
Number.prototype.toFixed小记
说明:toFixed经常被用来四舍五入,但这不是一个好方法.复现问题
解决方案
很明显这个是因为浮点的问题造成的(计算机准确的保存浮点)下面有老外的解决方案:Number.prototype.round = function(digits) { digits = Math.floor(digits); if (isNaN(digits) || digits === 0) { return Math.round(this); } if (digits < 0 || digits > 16) { throw 'RangeError: Number.round() digits argument must be between 0 and 16'; } var multiplicator = Math.pow(10, digits); return Math.round(this * multiplicator) / multiplicator; } Number.prototype.fixed = function(digits) { digits = Math.floor(digits); if (isNaN(digits) || digits === 0) { return Math.round(this).toString(); } var parts = this.round(digits).toString().split('.'); var fraction = parts.length === 1 ? '' : parts[1]; if (digits > fraction.length) { fraction += new Array(digits - fraction.length + 1).join('0'); } return parts[0] + '.' + fraction; }
//0.7875.fixed(3) /*0.788*/
过程
toFixed方法看不到源码,那么我们就去他的产生地吧,ECMAScript标准,这个就是javascript,我们的toFixed就是在这定义的,在google这个协议后,我们截下一部分相关的描述信息翻译一下
这里的翻译是针对第8条的,其整个原理并不涉及四舍五入,也就是说,toFixed的方法并不是用来四舍五入的,那为什么firefox下面会出现问题?
好吧,那么我们再追踪下源码看下吧,下载firefox某一个版本的源码.............这里折腾了半天,找到了一个相关的文件jsnum.cpp,jsnum.h文件
ToInteger方法在jsnum.h里面定义的,虽然没有编译,但是能够清晰的看到,toFixed方法在这个函数里面是被强制转换double了,这样能不有精度问题么?而ECMA上面的实现并非如此,至于IE,表示并不知道怎么实现的.
以上存心个人瞎编欢迎批评指正.
相关文章推荐
- JavaScript 中 Number.prototype.toFixed 方法五舍六入的问题
- javascript NUMBER toFixed()函数
- Notes on <Understanding AJAX: Using JavaScript to Create Rich Internet Applications>
- SQL语句中的<where><if>标签和 to_number()函数
- [原创]javascript prototype 对象 函数 <精简的美丽......>
- JavaScript中i.toString(16)的理解,Number.prototype.toString
- 【javascript笔记】关于函数的构造函数和prototype<四>
- JavaScript继承详解(二)<转>
- 杜绝<script src="js/tool.js" type="text/javascript"/>这样写的习惯
- Linq之ToDictionary<TSource, TKey, TElement>的写法
- LINQ 标准的查询操作符 转换 ToList()、ToLookup()、ToEnumerable()、ToDictionary、ToType<T>
- JavaScript继承详解(四) <转>
- JavaScript继承详解(三) <转>
- 深入浅出 Javascript API(五)--Query & Find 查询<转>
- 深入浅出 Javascript API(四)--绘制 Graphics<转>
- spring <bean scope="prototype">探讨
- 把textarea中字符串里含有的回车换行替换成<br>的javascript代码
- Using Prototype to Load Javascript Files
- Javascript学习笔记----String To Number
- <转>javascript实现图片的等比缩放