js 浮點(diǎn)數(shù)運(yùn)算的問題解決方法

閑聊原因:

其實 0.58*100 = 57.99999999999999 是不局限于任何語言的,是 IEEE 規(guī)定的浮點(diǎn)數(shù)的運(yùn)算標(biāo)準(zhǔn)。一般情況下,57.99999999999999 會四舍五入到 58。需要注意的是,浮點(diǎn)數(shù)的四舍五入和咱們普通的數(shù)學(xué)里面的也是不同的,浮點(diǎn)數(shù)遇到 5 后,不一定總是入,有時也舍,具體細(xì)節(jié)不多解釋了。
為什么結(jié)果是 57 呢,主要是因為 parseInt 和 intval 函數(shù)。他們的規(guī)則是,從第一個數(shù)字開始,知道遇到不是數(shù)字的字符,結(jié)束。
所以
parseInt("012") 結(jié)果是 10 (不要驚訝,0開頭的數(shù)字是八進(jìn)制)
parseInt("12abc") 結(jié)果是 12 (不解釋)
parseInt("12.123") 結(jié)果是 12

解決原理:

先把浮點(diǎn)數(shù)放大,然后除去對應(yīng)的倍數(shù)即可
加法:

function dcmAdd(arg1,arg2){
    var r1,r2,m; 
    try{r1=arg1.toString().split(".")[1].length;}catch(e){r1=0;}
    try{r2=arg2.toString().split(".")[1].length;}catch(e){r2=0;}
    m=Math.pow(10,Math.max(r1,r2));
    return (accMul(arg1,m)+accMul(arg2,m))/m;
}

減法:

function dcmAdd(arg1,arg2){
    var r1,r2,m; 
    try{r1=arg1.toString().split(".")[1].length;}catch(e){r1=0;}
    try{r2=arg2.toString().split(".")[1].length;}catch(e){r2=0;}
    m=Math.pow(10,Math.max(r1,r2));
    return (accMul(arg1,m)-accMul(arg2,m))/m;
}

乘法:

function accMul(arg1,arg2){
    var m=0,s1=arg1.toString(),s2=arg2.toString();
    try{m+=s1.split(".")[1].length}catch(e){}
    try{m+=s2.split(".")[1].length}catch(e){}
    return Number(s1.replace(".",""))*Number(s2.replace(".",""))/Math.pow(10,m)
}

除法:

function accDiv(arg1,arg2){
    var t1=0,t2=0,r1,r2;
    try{t1=arg1.toString().split(".")[1].length}catch(e){}
    try{t2=arg2.toString().split(".")[1].length}catch(e){}
    with(Math){
        r1=Number(arg1.toString().replace(".",""))
        r2=Number(arg2.toString().replace(".",""))
        return (r1/r2)*pow(10,t2-t1);
    }
}

晚輩感謝
參考鏈接1
參考鏈接2

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容