原生toFixed的bug

存在的问题 - 有些浏览器会存在这个问题

bash 复制代码
(1.35).toFixed(1) // '1.4'
(1.45).toFixed(1) // '1.4'
(1.55).toFixed(1) // '1.6'

1.45应该返回的是1.5

解决方案:

bash 复制代码
Number.prototype.toFixed = function(decimal){
  let str = this.toString()
  let strArr = str.split('.')
  let d = parseInt(decimal)
  // 参数为 0 和 非数字
  if(!d){
    return strArr[0]
  }
  // 整数
  if(str.indexOf('.') == -1){
    return str + '.' + '0'.repeat(d)
  }
  // 小数位不够
  if(strArr[1].length <= d){
    return str + '0'.repeat(d - strArr[1].length)
  }
  let num = strArr[1].charAt(d)
  strArr[1] = strArr[1].slice(0, d)
  // 有进位
  if(num - 5 >=0){
    let bit = this < 0 ? -1 : 1
    // 进位,正数加 1,负数加 -1
    let n = Number(strArr.join('')) + bit
    // 进位之后保留对应小数位
    let reg = new RegExp('(\\d{'+ d +'})$')
    return n.toString().replace(reg, '.$1')
  }
  return strArr.join('.')
}

原因:并非单纯的四舍五入,而是四舍六入五取偶的方法

​四舍​:当被修约的数字小于5时,该数字舍去。

​六入​:当被修约的数字大于等于6时,该数字舍去并向前进一位。

​五凑偶​:当被修约的数字为5时,处理较为复杂:

如果5后还有不为"0"的任何数,无论5的前面是奇数还是偶数,均应进位。

如果5后无有效数字,则需看5前面的数字。若为奇数,则向前进一位;若为偶数(包括0),则直接舍去5不进位。

相关推荐
憧憬成为web高手4 小时前
ACTF 12307复现
前端·bootstrap·html
wordbaby5 小时前
Axios 上传大文件崩溃:鸿蒙 RNOH 下 XHR 返回空响应头引发的"假失败"
前端·react native
wordbaby5 小时前
React Native 列表分页实战:下拉刷新与上拉加载的工程化方案
前端·react native
wordbaby5 小时前
脱离 Tab 栏的艺术:React Native 全屏子页面的导航架构实践
前端·react native·harmonyos
陈随易6 小时前
Redis 8.8发布,一定要更新
前端·后端·程序员
wordbaby6 小时前
React Native 新架构落地鸿蒙:跨三端政务级应用的工程实践与深度复盘
前端·react native·harmonyos
晓说前端6 小时前
第一篇:为什么学TypeScript?—— 优势、场景与环境搭建
javascript·ubuntu·typescript
excel7 小时前
为什么我推荐使用 Termius:现代 SSH 工具的完整体验
前端·后端
ZC跨境爬虫7 小时前
模块化烹饪小程序开发日记 Day7:(菜谱详情接口开发与JSON数据读取全流程)
前端·javascript·css·ui·微信小程序·json
এ慕ོ冬℘゜8 小时前
JS 前端基础面试题
开发语言·前端·javascript