当前位置: 首页 > news >正文

福州制作网站企业百度一下就会知道了

福州制作网站企业,百度一下就会知道了,域名备案查询工信部,绵阳银行网站建设toFixed() 方法可把 Number 四舍五入为指定小数位数的数字。例如将数据Num保留2位小数,则表示为:toFixed(Num);但是其四舍五入的规则与数学中的规则不同,使用的是银行家舍入规则,银行家舍入:所谓银行家舍入…

    toFixed() 方法可把 Number 四舍五入为指定小数位数的数字。例如将数据Num保留2位小数,则表示为:toFixed(Num);但是其四舍五入的规则与数学中的规则不同,使用的是银行家舍入规则,银行家舍入:所谓银行家舍入法,其实质是一种四舍六入五取偶(又称四舍六入五留双)法。具体规则如下:简单来说就是:四舍六入五考虑,五后非零就进一,五后为零看奇偶,五前为偶应舍去,五前为奇要进一。

经测试发现,在chorme下面,并没有完全遵守这个规则,尤其是5的后面没有数字的时候,不是这么判断的,如下:

var b = 1.335b.toFixed(2)"1.33"var b = 1.345b.toFixed(2)"1.34"var b = 1.355b.toFixed(2)"1.35"var b = 1.365b.toFixed(2)"1.36"var b = 1.375b.toFixed(2)"1.38"var b = 1.385b.toFixed(2)"1.39"

可以发现在chorme下没有完全去遵循这个规律,或许它有自己的算法,但是毕竟它没有遵循通用的银行家算法,所以tofixed这个方法在涉及到金钱计算的业务中还是少用.

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

一开始的办法是把要四舍五入的后一位单独拎出来单独判断。

解决方法:

通过重写toFixed方法:

Number.prototype.toFixed = function (n) {let result = number.toString();const arr = result.split('.');const integer = arr[0];const decimal = arr[1];result = integer + '.' + decimal.substr(0, n);const last = decimal.substr(n, 1);

// 四舍五入,转换为整数再处理,避免浮点数精度的损失

if (parseInt(last, 10) >= 5) {const x = Math.pow(10, n);result = ((parseFloat(result) * x) + 1) / x;result = result.toFixed(n);}return result;}

然后又发现计算机二进制编码导致的精度问题,详见上一篇博客。

自己debugger,发现页面中的js进了死循环。很明显问题出在toFixed中回调了toFixed,结果没有走出来,继续debugger,又有了惊人的发现。以下是控制台测试:

console.log(2.115 * 100) // 211.50000000000003console.log(2.0115 * 1000) // 2011.4999999999998

既然你一直进入循环,我就手动把你拉出来。

result = (Math.round((parseFloat(result)) * x) + 1) / x;

最终完整的重写toFixed的方法

// toFixed兼容方法Number.prototype.toFixed = function (n) {if (n > 20 || n < 0) {throw new RangeError('toFixed() digits argument must be between 0 and 20');}const number = this;if (isNaN(number) || number >= Math.pow(10, 21)) {return number.toString();}if (typeof (n) == 'undefined' || n == 0) {return (Math.round(number)).toString();}let result = number.toString();const arr = result.split('.');// 整数的情况if (arr.length < 2) {result += '.';for (let i = 0; i < n; i += 1) {result += '0';}return result;}const integer = arr[0];const decimal = arr[1];if (decimal.length == n) {return result;}if (decimal.length < n) {for (let i = 0; i < n - decimal.length; i += 1) {result += '0';}return result;}result = integer + '.' + decimal.substr(0, n);const last = decimal.substr(n, 1);// 四舍五入,转换为整数再处理,避免浮点数精度的损失if (parseInt(last, 10) >= 5) {const x = Math.pow(10, n);result = (Math.round((parseFloat(result) * x)) + 1) / x;result = result.toFixed(n);}return result;}

http://www.yayakq.cn/news/242169/

相关文章:

  • 网站开发哈尔滨网站开发公司成都建设网官方网站
  • 可以在什么网站做二建题目专业做电子的外贸网站
  • 嘉禾专业网站建设制作单位网站
  • wordpress 直接拖拽式建站陕西省安康市建设局网站
  • vs做网站创建项目时选哪个微电影网站模板
  • 申请一个网站得多钱制作网页第一件事就是选定一种
  • 如何在淘宝客上做自己的网站如何写好一篇软文
  • 电子商务网站源码下载wordpress79元主题
  • 杭州seo网站推广十大广告设计公司简介
  • 西安网站建设推广公司哪家好用wordpress仿一个网站
  • 网站建设的费用记什么科目哪里有做装修网站
  • 公司做网站的法律依据阳江网络问政平台 周报
  • 网站建设html代码如何添加替换wordpress
  • 企业网站管理系统标签手册重庆做石材的网站
  • 如何用asp.net做网站短视频seo关键词
  • 西安SEO网站建设哪家好网站接广告平台
  • 绥芬河市建设局网站邢台建设企业网站费用
  • 深圳市住房建设部网站wordpress自定义文章
  • 网站建设国际深圳公司变更注册地址的流程
  • 学网站建设的学校花木网站源码
  • 3d设计公司企业网站优化兴田德润优惠
  • 外包网站制作多少钱网站建设企业站有哪些要求
  • 网站开发的理解做网站电子版报价模板
  • 单页网站产品做哈尔滨本地门户网站赚钱吗
  • 免费免费建站wordpress中文包
  • 智能建站公司上海做家庭影院的公司网站
  • 深圳网站 制作信科便宜国外网站 dns
  • html做的宠物网站网站域名查主机
  • 在京东上怎样做网站wordpress+移动客户端
  • 全国分站seo佛山新网站制作咨询