Javascript中 toFixed四舍六入方法


Posted in Javascript onAugust 21, 2017

javascript中toFixed使用的是银行家舍入规则。

银行家舍入:所谓银行家舍入法,其实质是一种四舍六入五取偶(又称四舍六入五留双)法。

简单来说就是:四舍六入五考虑,五后非零就进一,五后为零看奇偶,五前为偶应舍去,五前为奇要进一。但是不论引入toFixed解决浮点数计算精度缺失的问题也好,它有没有使用银行家舍入法也罢,都是为了解决精度的问题,但是又离不开二进制浮点数的环境,但至少他帮助我们找到了问题所在,从而让我们有解决方法。

Number.prototype.toFixed = function(length)
    {
      var carry = 0; //存放进位标志
      var num,multiple; //num为原浮点数放大multiple倍后的数,multiple为10的length次方
      var str = this + ''; //将调用该方法的数字转为字符串
      var dot = str.indexOf("."); //找到小数点的位置
      if(str.substr(dot+length+1,1)>=5) carry=1; //找到要进行舍入的数的位置,手动判断是否大于等于5,满足条件进位标志置为1
      multiple = Math.pow(10,length); //设置浮点数要扩大的倍数
      num = Math.floor(this * multiple) + carry; //去掉舍入位后的所有数,然后加上我们的手动进位数
      var result = num/multiple + ''; //将进位后的整数再缩小为原浮点数
      /*
      * 处理进位后无小数
      */
      dot = result.indexOf(".");
      if(dot < 0){
        result += '.';
        dot = result.indexOf(".");
      }
      /*
      * 处理多次进位
      */
      var len = result.length - (dot+1);
      if(len < length){
        for(var i = 0; i < length - len; i++){
          result += 0;
        }
      }
      return result;
    }

该方法的大致思路是首先找到舍入位,判断该位置是否大于等于5,条件成立手动进一位,然后通过参数大小将原浮点数放大10的参数指数倍,然后再将包括舍入位后的位数利用floor全部去掉,根据我们之前的手动进位来确定是否进位。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
dojo 之基础篇(二)之从服务器读取数据
Mar 24 Javascript
jQuery实现的支持IE的html滑动条
Mar 16 Javascript
基于JavaScript判断浏览器到底是关闭还是刷新(超准确)
Feb 01 Javascript
基于jquery实现下拉框美化特效
Feb 02 Javascript
Js调用Java方法并互相传参的简单实例
Aug 11 Javascript
JS常见疑难点分析之match,charAt,charCodeAt,map,search用法分析
Dec 25 Javascript
深入理解Javascript箭头函数中的this
Feb 13 Javascript
利用原生js实现html5小游戏之打砖块(附源码)
Jan 03 Javascript
vue.js使用v-if实现显示与隐藏功能示例
Jul 06 Javascript
vue地址栏直接输入路由无效问题的解决
Nov 15 Javascript
Elementui表格组件+sortablejs实现行拖拽排序的示例代码
Aug 28 Javascript
Vue export import 导入导出的多种方式与区别介绍
Feb 12 Javascript
webpack使用 babel-loader 转换 ES6代码示例
Aug 21 #Javascript
JavaScript创建对象的七种方式全面总结
Aug 21 #Javascript
webpack处理 css\less\sass 样式的方法
Aug 21 #Javascript
Vue中建立全局引用或者全局命令的方法
Aug 21 #Javascript
JS实现身份证输入框的输入效果
Aug 21 #Javascript
Vue自定义指令使用方法详解
Aug 21 #Javascript
javascript实现Java中的Map对象功能的实例详解
Aug 21 #Javascript
You might like
php flv视频时间获取函数
2010/06/29 PHP
php读取csv文件后,uft8 bom导致在页面上显示出现问题的解决方法
2013/08/10 PHP
PHP实现查询手机归属地的方法详解
2017/04/28 PHP
PHP使用Redis长连接的方法详解
2018/02/12 PHP
flexigrid 参数说明
2010/11/23 Javascript
JS获取select-option-text_value的方法
2013/12/26 Javascript
js实现的标题栏新消息闪烁提示效果
2014/06/06 Javascript
JS+CSS实现的漂亮渐变背景特效代码(6个渐变效果)
2016/03/25 Javascript
JavaScript检测原始值、引用值、属性
2016/06/20 Javascript
基于bootstrap的文件上传控件bootstrap fileinput
2016/12/23 Javascript
很棒的一组js图片轮播特效
2017/01/12 Javascript
详解nodejs微信jssdk后端接口
2017/05/25 NodeJs
JavaScript中Object值合并方法详解
2017/12/22 Javascript
详解Vue一个案例引发「内容分发slot」的最全总结
2018/12/02 Javascript
彻底揭秘keep-alive原理(小结)
2019/05/05 Javascript
Vue中使用JsonView来展示Json树的实例代码
2020/11/16 Javascript
详解阿里Node.js技术文档之process模块学习指南
2021/01/04 Javascript
Python多线程编程之多线程加锁操作示例
2018/09/06 Python
python flask框架实现传数据到js的方法分析
2019/06/11 Python
对pyqt5多线程正确的开启姿势详解
2019/06/14 Python
python爬虫爬取笔趣网小说网站过程图解
2019/11/18 Python
Python3 selenium 实现QQ群接龙自动化功能
2020/04/17 Python
Python 使用生成器代替线程的方法
2020/08/04 Python
canvas绘制树形结构可视图形的实现
2020/04/03 HTML / CSS
html5启动原生APP总结
2020/07/03 HTML / CSS
英国花园家具中心:Garden Furniture Centre
2017/08/24 全球购物
俄罗斯大型在线书店:Читай-город
2019/10/10 全球购物
阿联酋手表和配饰购物网站:Rivolishop
2019/11/25 全球购物
中学实习教师自我鉴定
2013/12/12 职场文书
信息专业毕业生五年职业规划参考
2014/02/06 职场文书
集体备课反思
2014/02/12 职场文书
背起爸爸上学观后感
2015/06/08 职场文书
党员读书活动心得体会
2016/01/14 职场文书
python爬虫之爬取笔趣阁小说
2021/04/22 Python
解决使用了nginx获取IP地址都是127.0.0.1 的问题
2021/09/25 Servers
SpringCloud中分析讲解Feign组件添加请求头有哪些坑梳理
2022/06/21 Java/Android