您的位置:首页 > Web前端

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

  • 点赞
  • 收藏
  • 分享
  • 文章举报
姜天生i 发布了10 篇原创文章 · 获赞 1 · 访问量 213 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: