js实现 数字相乘 标准四舍五入,并保留小数点
项目中有大量的数字运算,其中乘法用的最多。今天客户那边提了这么一个问题:应该显示111.938的文本框显示了111.937。其实问题定位很简单,我用的是tofixed()方法来进行四舍五入处理,后来才知道这玩意它不是四舍五入,是银行家算法(四舍六入五取偶)。网上随便拉取了一段标准的四舍五入方法也可以解决。
问题1:四舍五入
1.四舍五入方法+保留小数位数
//四舍五入方法,保留小数方法
//data:需要处理的数据 size:需要保留几位小数
function fourFive(data,size) {
let a = Math.pow(10,size)
//最终四舍五入得出的结果
let result = Math.round(data * a) / a
//保留小数位操作
let b = result.toString().split(".")
if(b.length>1){
let c = b[1].toString().split("").length
if(c == size ){
return result
}else{
return result.toFixed(size)
}
}else{
return result.toFixed(size)
}
}
问题2:小数相乘可以乘出来无限循环小数
1.问题展示
基础没学好,我以为它乘出来应该是个小数点后4位的小数(111.9375),结果出来是个无限循环小数
2.解决办法
//解决小数相乘出现无限循环小数方法
function findDecimal (data1,data2) {
//data1为计划量 data2为公式参数
//逻辑思路。先将两个待乘的参数全部转为整数,将小数点后移。
//考虑第一个乘数
let data1Size = 0
let data1New = 0
let data1Array = data1.toString().split(".")
if(data1Array.length != 1){
data1Size = data1Array[1].toString().split("").length
data1New = data1*Math.pow(10,data1Size)
}else{
data1New = data1
}
//考虑第二个乘数
let data2Size = 0
let data2New = 0
let data2Array = data2.toString().split(".")
if(data2Array.length != 1){
data2Size = data2Array[1].toString().split("").length
data2New = data2*Math.pow(10,data2Size)
}else{
data2New = data2
}
//开始乘法计算
let resultOne = data1New * data2New
let a = Math.pow(10,data1Size + data2Size)
return resultOne/a
}
实用
//19.9乘4.1245 保留2位小数
$("#record2").val(fourFive(findDecimal(19.9,4.1245),2))
结果
可以给任意数字相乘