js 精度计算

js 精度计算

js文件

/**
 * Created by xiewu on 2016/9/11.
 */
//浮点数加减乘除法对象
var jsFloat={
    'add':addCalc,//加法运算
    'subtract':subtractCalc,//减法运算
    'ride':rideCalc,//乘法运算
    'divide':divideCalc//除法运算
};

//加法运算
function addCalc(num0,num1){
    var numLen0=getPointBackLen(num0),//第一个值的的小数位数
        numLen1=getPointBackLen(num1),//第二个值的的小数位数
        maxLen=Math.max(numLen0,numLen1),//小数位数的最大值
        numLenDiff=0,//小数的差数
        num0Str='',//第一个值去掉小数点转字符
        num1Str='',//第二个值去掉小数点转字符
        operationReault=0;//返回计算后的值

    if(maxLen==0){
        operationReault=Number(num0)+Number(num1);
        return operationReault;
    }
    numLenDiff=numLen0-numLen1;
    num0Str=clearPoint(num0,".");
    num1Str=clearPoint(num1,".");

    //根据numLenDiff的正负来判断哪个数字的位数是短的,来走补全
    if(numLenDiff>0){
        num1Str=addZeroBack(num1Str,numLenDiff);
    }else if(numLenDiff<0){
        num0Str=addZeroBack(num0Str,Math.abs(numLenDiff));
    }
    //执行计算
    operationReault=addZeroFront((Number(num0Str)+Number(num1Str)).toString(),maxLen);
    return Number(operationReault.slice(0,-maxLen)+"."+operationReault.slice(-maxLen));
}

//减法运算
function subtractCalc(num0,num1){
    var numLen0=getPointBackLen(num0),//第一个值的的小数位数
        numLen1=getPointBackLen(num1),//第二个值的的小数位数
        maxLen=Math.max(numLen0,numLen1),//小数位数的最大值
        numLenDiff=0,//小数的差数
        num0Str='',//第一个值去掉小数点转字符
        num1Str='',//第二个值去掉小数点转字符
        operationReault=0;//返回计算后的值

    if(maxLen==0){
        operationReault=Number(num0)-Number(num1);
        return operationReault;
    }

    numLenDiff=numLen0-numLen1;
    num0Str=clearPoint(num0,".");
    num1Str=clearPoint(num1,".");

    //根据numLenDiff的正负来判断哪个数字的位数是短的,来走补全
    if(numLenDiff>0){
        num1Str=addZeroBack(num1Str,numLenDiff);
    }else if(numLenDiff<0){
        num0Str=addZeroBack(num0Str,Math.abs(numLenDiff));
    }
    //执行计算
    operationReault=addZeroFront((Number(num0Str)-Number(num1Str)).toString(),maxLen);
    return Number(operationReault.slice(0,-maxLen)+"."+operationReault.slice(-maxLen));
}

//乘法运算
function rideCalc(num0,num1){
    var num0Len=getPointBackLen(num0),//第一个值的的小数位数
        num1Len=getPointBackLen(num1),//第二个值的的小数位数
        maxLen=Math.max(num0Len,num1Len),//取得小数位数中的最大数
        digitLen=0,//小数位数的统计值
        num0Str='',//第一个值去掉小数点转字符存偖
        num1Str='',//第二个值去掉小数点转字符存偖
        operationReault=0;//计算结果

    if(maxLen===0){//如果数字原本就是整形,直接执行计算
        operationReault=Number(num0)*Number(num1);
        return operationReault;
    }

    num0Str=clearPoint(num0,".");
    num1Str=clearPoint(num1,".");
    digitLen=num0Len+num1Len;//小数位数的总数
    
    operationReault=addZeroFront((Number(num0Str)*Number(num1Str)).toString(),digitLen);//对乘法运算后的结果执行位数补全
    return Number(operationReault.slice(0,-digitLen)+"."+operationReault.slice(-digitLen));
}

//除法运算
function divideCalc(num0,num1){
    var num0Len=getPointBackLen(num0),//第一个值的的小数位数
        num1Len=getPointBackLen(num1),//第二个值的的小数位数
        maxLen=Math.max(num0Len,num1Len),//取得小数位数中的最大数
        digitLen,//小数位数的统计值
        num0Str,//第一个值去掉小数点转字符存偖
        num1Str,//第二个值去掉小数点转字符存偖
        operationReault,//计算结果
        resultPointNum;//除法后结果的小数位数

    if(maxLen===0){//如果数字原本就是整形,直接执行计算
        operationReault=Number(num0)/Number(num1);
        return operationReault;
    }

    num0Str=clearPoint(num0,".");
    num1Str=clearPoint(num1,".");
    digitLen=num0Len-num1Len;//小数位数的差数
    operationReault=Number(num0Str)/Number(num1Str);
    if(digitLen==0){//如果除数,被除除数小数位相同,即直接返回计算值
        return operationReault;
    }
    resultPointNum=getPointBackLen(operationReault);//除法计算后可能的小数位数
    operationReault=clearPoint(operationReault,".");//除法运算结果去小数位数
    digitLen=digitLen+resultPointNum;//最后应该保留的小数位数
    if(digitLen>0){//如果要保留的小数位数不够
        operationReault=addZeroFront(operationReault,digitLen);//对计算的结果前补0
        return Number(operationReault.slice(0,-digitLen)+"."+operationReault.slice(-digitLen));
    }else {//如果要保留的小数位数小于0
        digitLen=Math.abs(digitLen);
        operationReault=addZeroBack(operationReault,digitLen);//对计算的结果后补0
        return Number(operationReault);
    }

}
//后补0补够位数,str是当前的字符串,len是应该补的位数
function addZeroBack(str,len){
    for(var i=0;i<len;i++){
        str=str+"0";
    }
    return str;
}
//前置0补够位数,str是当前的字符串,len是处理后应该有的位数
function addZeroFront(str,len){
    var getStr='',
        saveStr='',
        strLen=0,//存储当前字符串的长度
        addLen=0,//应该补位的个数
        returnStr='';
    //如果传进去的值是负值,那就要先存储符号
    if(str.indexOf('-')!=-1){
        getStr=str.replace('-','');
        saveStr='-';
    }else{
        getStr=str;
    }
    strLen=getStr.length;
    addLen=len-strLen;
    if(addLen<=0){
        returnStr=str;
    } else {
        for(var i=0;i<addLen;i++){
            getStr="0"+getStr;
        }
        returnStr=saveStr+getStr;
    }
    return returnStr;
}
//取得小数位数
function getPointBackLen(num){
    var returnLen=0;
    try {
        returnLen=num.toString().split(".")[1].length;//获取小数位数
    }catch(e){
        returnLen=0;
    }
    return returnLen;
}
//浮点型数去小数点转字符串
function clearPoint(num,str){
    var getStr=num.toString();
    if(getStr.indexOf(str)!=-1){
        return getStr.replace(str,"");
    }
    return getStr;

}

前端测试文件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>浮点数计算示例</title>
    <style>
        *{
            padding:0;
            margin:0;
        }
        ul,li{
            list-style:none;
        }
        input[type=text]{
            width:160px;
            height:40px;
        }
        input[type=button]{
            padding:0 10px;
            height:40px;
        }
        #resultList{
            font-size:16px;
            line-height:24px;

        }
        #resultList li{
            padding-top:10px;
        }
        #resultList b{
            color:green;
        }
        .opearation-wrap{
            width:400px;
            margin:100px auto 0 auto;
        }
    </style>
</head>
<body>
    <div class="opearation-wrap">
        <input type="text" id="inputNum0">
        <input type="text" id="inputNum1"><br /><br />
        <input type="button" value="执行+" id="startOperation0">
        <input type="button" value="执行-" id="startOperation1">
        <input type="button" value="执行*" id="startOperation2">
        <input type="button" value="执行/" id="startOperation3">
        <input type="button" value="执行all" id="startOperation">
        <ul id="resultList">
            <li>加法原始计算值<i></i><br>优化后计算值<em></em></li>
            <li>减法原始计算值<i></i><br>优化后计算值<em></em></li>
            <li>乘法原始计算值<i></i><br>优化后计算值<em></em></li>
            <li>除法原始计算值<i></i><br>优化后计算值<em></em></li>
        </ul>
    </div>
<script src="jsFloatCompute.js"></script>
<script>
    var numInput0=document.getElementById("inputNum0"),
        numInput1=document.getElementById("inputNum1"),
        resultList=document.getElementById("resultList"),
        showListOld=resultList.getElementsByTagName("i"),
        showList=resultList.getElementsByTagName("em");
    //执行加法
    document.getElementById("startOperation0").onclick=function(){
        var num0=numInput0.value,
            num1=numInput1.value;
        showListOld[0].innerHTML=Number(num0)+Number(num1);
        showList[0].innerHTML=jsFloat.add(num0,num1);
    }
    //执行减法
    document.getElementById("startOperation1").onclick=function(){
        var num0=numInput0.value,
            num1=numInput1.value;
        showListOld[1].innerHTML=num0-num1;
        showList[1].innerHTML=jsFloat.subtract(num0,num1);
    }
    //执行乘法
    document.getElementById("startOperation2").onclick=function(){
        var num0=numInput0.value,
            num1=numInput1.value;
        showListOld[2].innerHTML=num0*num1;
        showList[2].innerHTML=jsFloat.ride(num0,num1);
    }
    //执行除法
    document.getElementById("startOperation3").onclick=function(){
        var num0=numInput0.value,
            num1=numInput1.value;
        showListOld[3].innerHTML=num0/num1;
        showList[3].innerHTML=jsFloat.divide(num0,num1);
    }
    //一次执行所有计算
    document.getElementById("startOperation").onclick=function(){
        var num0=numInput0.value,
            num1=numInput1.value;
        showListOld[0].innerHTML=Number(num0)+Number(num1);
        showListOld[1].innerHTML=num0-num1;
        showListOld[2].innerHTML=num0*num1;
        showListOld[3].innerHTML=num0/num1;
        showList[0].innerHTML=jsFloat.add(num0,num1);
        showList[1].innerHTML=jsFloat.subtract(num0,num1);
        showList[2].innerHTML=jsFloat.ride(num0,num1);
        showList[3].innerHTML=jsFloat.divide(num0,num1);
    }
</script>
</body>
</html>
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值