js 在前端实际开发中,进行前端计算及社保公积金核算会出现丢失精度的问题,项目中需要对金钱进行运算
2020-02-12 19:40
781 查看
今天因为项目需要做社保公积金缴纳金额得核算,所以在前端计算需要十分精确并且需要对所得计算金额进行一些计算规则的处理(四舍五入到角,见分进角,全舍到角…),因此引用了bigDecimal工具来实现
bigDecimal: Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算 需要的可以自行百度
下面直接上代码-----
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> <script src="mathcontext.js"></script> <script src="bigdecimal.js"></script> </head> <body> <script> function test(decimalRule,d){ if ("01sswrtoyuan".includes(decimalRule)) { // 01sswrtoyuan 四舍五入到元 四舍五入到元 保留0位小数 let bg = new BigDecimal(d); let f1 = bg.setScale(0, MathContext.prototype.ROUND_HALF_UP).toString() + '.00'; return f1; } else if ("02sswrtojiao".includes(decimalRule)) { // 02sswrtojiao 四舍五入到角 四舍五入到角 保留1位小数 let bg = new BigDecimal(d); let f1 = bg.setScale(1, MathContext.prototype.ROUND_HALF_UP).toString() + '0'; return f1; } else if ("03sswrtofen".includes(decimalRule)) { // 03sswrtofen 四舍五入到分 四舍五入到分 保留2位小数 let bg = new BigDecimal(d); let f1 = bg.setScale(2, MathContext.prototype.ROUND_HALF_UP).toString(); return f1; } else if ("04sswrtoli".includes(decimalRule)) { // 04sswrtoli 四舍五入到厘 四舍五入到厘 保留3位小数 let bg = new BigDecimal(d); let f1 = bg.setScale(3, MathContext.prototype.ROUND_HALF_UP).toString(); return f1; } else if ("05jjjy".includes(decimalRule)) { // 05jjjy 见角进元 见角进元 保留0位小数 let bg = new BigDecimal(d); let isSum = '1' if (d.split('.')[1]) { isSum = d.split('.')[1].substring(0, 1) } else { isSum = '1' } let f1 = 0; if ("0".includes(isSum)){ f1 = bg.setScale(0, MathContext.prototype.ROUND_HALF_UP).toString() + '.00'; } else { f1 = bg.setScale(0, MathContext.prototype.ROUND_UP).toString() + '.00'; } return f1; } else if ("06jfjj".includes(decimalRule)) { // 06jfjj 见分进角 见分进角 保留1位小数 let bg = new BigDecimal(d); let f1 = 0; let isSum = '1' if (d.split('.')[1]) { isSum = d.split('.')[1].substring(1, 2) } else { isSum = '1' } if ("0".includes(isSum)){ f1 = bg.setScale(1, MathContext.prototype.ROUND_DOWN).toString() + '0'; } else { f1 = bg.setScale(1, MathContext.prototype.ROUND_UP).toString() + '0'; } return f1; } else if ("07jljf".includes(decimalRule)) { // 07jljf 见厘进分 见厘进分 保留2位小数 let bg = new BigDecimal(d); let f1 = 0; let isSum = '1' if (d.split('.')[1]) { isSum = d.split('.')[1].substring(2, 3) } else { isSum = '1' } if ("0".includes(isSum)){ f1 = bg.setScale(2, MathContext.prototype.ROUND_DOWN).toString(); } else { f1 = bg.setScale(2, MathContext.prototype.ROUND_UP).toString(); } return f1; } else if ("08jhjl".includes(decimalRule)) { // 08jhjl 见毫进厘 见毫进厘 保留3位小数 let bg = new BigDecimal(d); let f1 = 0; let isSum = '1' if (d.split('.')[1]) { isSum = d.split('.')[1].substring(3, 4) } else { isSum = '1' } if ("0".includes(isSum)){ f1 = bg.setScale(3, MathContext.prototype.ROUND_DOWN).toString(); } else { f1 = bg.setScale(3, MathContext.prototype.ROUND_UP).toString(); } return f1; } else if ("09qstoyuan".includes(decimalRule)) { // 09qstoyuan 全舍到元 全舍到元 保留0位小数. let bg = new BigDecimal(d); let f1 = bg.setScale(0, MathContext.prototype.ROUND_DOWN).toString() + '.00'; return f1; } else if ("10qstojiao".includes(decimalRule)) { // 10qstojiao 全舍到角 全舍到角 保留1位小数 let bg = new BigDecimal(d); let f1 = bg.setScale(1, MathContext.prototype.ROUND_DOWN).toString() + '0'; return f1; } else if ("11qstofen".includes(decimalRule)) { // 11qstofen 全舍到分 全舍到分 保留2位小数 let bg = new BigDecimal(d); let f1 = bg.setScale(2, MathContext.prototype.ROUND_DOWN).toString(); return f1; } else if ("12qstoli".includes(decimalRule)) { // 12qstoli 全舍到厘 全舍到厘 保留3位小数 let bg = new BigDecimal(d); let f1 = bg.setScale(3, MathContext.prototype.ROUND_DOWN).toString(); return f1; } } console.log(test('01sswrtoyuan', '1.61')) console.log(test('02sswrtojiao', '1.62')) console.log(test('03sswrtofen', '9.99')) console.log(test('04sswrtoli', '1.65756')) console.log(test('05jjjy', '1.65')) console.log(test('05jjjy', '1.05')) console.log(test('06jfjj', '215.27')) console.log(test('06jfjj', '100.820')) console.log(test('06jfjj', '100.821')) console.log(test('07jljf', '100.820')) console.log(test('07jljf', '100.821')) console.log(test('07jljf', '1.1')) console.log(test('08jhjl', '1.0000')) console.log(test('08jhjl', '1.0007')) console.log(test('09qstoyuan', '9.123')) console.log(test('10qstojiao', '19.123')) console.log(test('11qstofen', '12.123')) console.log(test('12qstoli', '12.12398')) </script> </body> </html> /* 只要见角进元 见分进角 见厘进分 见毫进厘 需要做特殊处理 在当前的位判断是否为0 为0舍去 不为0向前进一 */
注意: 需要引入bigDecimal的js文件链接自行下载
https://download.csdn.net/download/qq_37041819/12023936 https://download.csdn.net/download/qq_37041819/12023943
- 点赞
- 收藏
- 分享
- 文章举报
相关文章推荐
- JS小数运算丢失精度计算错误等解决方案
- p2p项目金钱计算缺少精度问题
- Java电商项目面试--浮点型商业运算中丢失精度问题
- js 浮点运算出现的精度丢失问题
- 金融项目java开发_BigDecimal(解决计算精度问题)
- JS的浮点数计算精度丢失问题解决方案
- JS 浮点数四则运算精度丢失问题
- Java中的浮点型进行四则运算精度丢失的问题
- JS浮点类型运算精度丢失问题解决办法
- js浮点运算精度丢失问题
- 说明 安卓开发的时候需要进行注意,路径名称千万不要用中文否则会出现一系列的问题........
- JS 浮点数四则运算精度丢失问题
- 金融项目java开发_BigDecimal(解决计算精度问题)
- float类型进行计算精度丢失的问题
- JS浮点类型运算精度丢失问题解决办法
- js中小数运算精度丢失问题
- [置顶] double、float类型进行运算造成精度丢失的问题解决
- JS 浮点运算精度解决办法 (把小数转换为整数进行计算【但是不能超过js的整数上限】)
- android java double 进行运算时,经常出现精度丢失的问题
- JAVA-进行Java Web项目开发需要掌握的技术