首页 > 其他分享 >JS 数字类型的加减乘除, 四舍五入保持精度

JS 数字类型的加减乘除, 四舍五入保持精度

时间:2023-10-16 21:45:57浏览次数:32  
标签:四舍五入 const r1 r2 Number JS changeNum toString 加减乘除

Number.prototype.toFixed = function (d = 0) {
	let changeNum
        = this + ''// 把数字转为字符串
	if (changeNum.indexOf('-') != -1){// 判断是否是负数
	  changeNum = Math.abs(Number(changeNum))
  }
	changeNum = (Math.round(Number(changeNum) * Math.pow(10, d)) / Math.pow(10, d)).toString()
	const index = changeNum.indexOf('.')// 判断字符是否有小数点
	if (index === -1) { // 如果没有小数点,加上对应个数的小数点
		changeNum += '.'
		changeNum += new Array(d + 1).join('0')
	} else if (index > 0) { // 如果有,index是小数点的坐标值,比如在第二位index=1
		const temp = d - (changeNum.length - index - 1)// 小数点后的位数小于要取舍的个数,用0补齐;数字的长度-小数点的坐标值-1=小数的位数(小数点也占以为,4.00 length:4;.的index是1)
		if (temp > 0) {
			changeNum += new Array(temp + 1).join('0')
		}
	}
	if (this.toString().indexOf('-') != -1) { // 如果是负数,加上-
		changeNum = '-' + changeNum
	}
	return changeNum
}
Number.prototype.add = function (arg2){
  const arg1 = this 
	let r1, r2
	try {
		r1 = arg1.toString().split('.')[1].length
	} catch (e) {
		r1 = 0
	}
	try {
		r2 = arg2.toString().split('.')[1].length
	} catch (e) {
		r2 = 0
	}
	const m = Math.pow(10, Math.max(r1, r2))

	return (arg1 * m + arg2 * m) / m
}
Number.prototype.sub = function (arg2){
  const arg1 = this
	let r1, r2
	try {
		r1 = arg1.toString().split('.')[1].length
	} catch (e) {
		r1 = 0
	}
	try {
		r2 = arg2.toString().split('.')[1].length
	} catch (e) {
		r2 = 0
	}
	const m = Math.pow(10, Math.max(r1, r2)) // 动态控制精度长度
	const n = (r1 >= r2) ? r1 : r2
	return parseFloat(((arg1 * m - arg2 * m) / m).toFixed(n))
}
Number.prototype.mul = function(arg2){
  const arg1 = this
	let m = 0
	const s1 = arg1.toString()
	const s2 = arg2.toString()
  try{
    m += s1.split('.')[1].length
  }catch(e){
    m +=0
  }
  try{
    m += s2.split('.')[1].length
  }catch(e){
    m +=0
  }
	return Number(s1.replace('.', '')) * Number(s2.replace('.', '')) / Math.pow(10, m)
}
Number.prototype.div = function(arg2){
  const arg1 = this
	let t1 = 0
	let t2 = 0
  try{
    t1 = this.toString().split('.')[1].length
  }catch(e){
    t1 = 0
  }
  try{
    t2 = arg2.toString().split('.')[1].length
  }catch(e){
    t2 = 0
  }
	const r1 = Number(arg1.toString().replace('.', ''))
	const r2 = Number(arg2.toString().replace('.', ''))
	return (r1 / r2) * Math.pow(10, t2 - t1)
}
Number.prototype.toLocalString = function(num = 0){
  let str = this.toLocaleString()
  if(num > 0){
    str = str.split('.')[0] + '.' + this.toFixed(num).split('.')[1]
  }
  return str
}

  使用方法

// 0.41
(0.19).add(0.22)

  

标签:四舍五入,const,r1,r2,Number,JS,changeNum,toString,加减乘除
From: https://www.cnblogs.com/wangacan/p/17768448.html

相关文章

  • Nest.js Controller 解析:探索路由和请求处理的强大功能
    Controller 它主要是负责特定路由请求处理并将响应结果返回给客户端。每个控制器它会有多个路由,不同路由对应不同的业务请求处理。在Nest 中,创建一个控制器,应该使用类和装饰器,装饰器会使类相关联的数据的关联起来,将请求绑定到相应的控制器。可以使用Nest-cli提供的......
  • .net 6.0 返回json时中文编码处理
    近期由于自己搭建.net6.0的框架在返回前台json是遇到下面这个问题,返回的json被编码了所以特此在这记录一下 编码前是这样的{"code":-1,"msg":"\u9A8C\u8BC1\u7801\u9519\u8BEF\uFF01"}处理完正常{"code":-1,"msg":"验证码错误!"}在Program中添加下面代码即可//返......
  • js 函数如何实现策略模式与状态模式
    前言有关设计模式的学习资料中,大部分都是以java语言实现的,毕竟java作为老牌面向对象的语言最能说明设计模式的核心概念,所以js的相关设计模式的学习资料也大多使用class类实现,本文记录下js使用函数实现策略模式和状态模式设计模式的方式,更有助于理解策略模式和状态模式......
  • JS实现导出Excel的五种方法详解
    <!DOCTYPEhtml><html><headlang="en"><metacharset="UTF-8"><title>html表格导出道</title><scriptlanguage="JavaScript"type="text/javascript">//第一种方法function......
  • Python爬虫:抖音 JS XB逆向解析
    哈喽兄弟们,抖音现在有JS加密,以前的方法爬不了饿了,今天来实现一下某音短视频的JS逆向解析。知识点动态数据抓包`在这里插入代码片`requests发送请求X-Bogus 参数逆向环境模块python 3.8               运行代码pycharm 2022.3           辅......
  • 2023年10月最新全国省市区县和乡镇街道行政区划矢量边界坐标经纬度地图数据 shp geojs
    发现个可以免费下载全国 geojson 数据的网站,推荐一下。支持全国、省级、市级、区/县级、街道/乡镇级以及各级的联动数据,支持导入矢量地图渲染框架中使用,例如:D3、Echarts等geojson数据下载地址:https://geojson.hxkj.vip该项目github地址:https://github.com/TangSY/echarts-m......
  • JS 实现模拟键盘事件
    //获取事件需要绑定的节点varinp=document.getElementById('id')//创建初始化event事件varevent=newKeyboardEvent("keyup",{which:13,keyCode:13,key:'Enter',code:'Enter'});//执行inp.dispatchEvent(event) 参考:https://develo......
  • JS小应用
    JS访问列表内容思路:1.获取对象数组以后,以超链接显示。对应id放在链接方法的参数里。2.点击链接以后,先把id存在session里,再跳转到显示内容页面。3.在显示内容页面,读取id,之后就简单了。请求资源,显示内容。列表页面,index.html: <!DOCTYPEhtml><html><head><m......
  • 【前端开发】可视化大屏网页适配方案autofit.js
    说明:针对全屏的网页,使用autofit.js可自适应大小屏幕,原理是通过屏幕改变放大/缩小网页,并做了留白区域的兼容处理。 地址:https://github.com/huiJeck/autofit.js#autofitjs......
  • JS基础篇(一些记录)
    JS一些问题记录1.switch,break后只会退出switch本身用于防止穿透,外层比如for不会退出,ifbreak的话就会退出整个循环2.三元运算符用于比较简单的两个东西之间的比较,也不能输出打印出来,但是if双分支就可以3.同一个页面两个for,都用i不会冲突,是两个局部变量不会影响4.for里面嵌套for......