js運(yùn)算精度丟失的2個(gè)解決方法
當(dāng)兩個(gè)數(shù)包含小數(shù)進(jìn)行運(yùn)算的時(shí)候結(jié)果并不是正確的結(jié)果,而是出現(xiàn)了精度丟失的情況(小數(shù)點(diǎn)后面出現(xiàn)很多位)。
問題所在:
res.orderColorDeliveryRecords.forEach((item) => { //計(jì)算金額 item.money = (item.price * item.amount); if(!item.cusTypeName){ item.cusTypeName = 'N/A'; } this.record.money += parseFloat(item.money); });
界面顯示:
解決方法1(低精度):
在運(yùn)算結(jié)果的后面加上toFixed(),精度要求不高的情況下使用;
toFixed介紹:
用法: number.toFixed( value )
參數(shù):此函數(shù)參數(shù)列表有一個(gè)參數(shù),他表示小數(shù)點(diǎn)后面精確的位數(shù)。
返回值:他以字符串表示形式返回一個(gè)數(shù)字。
代碼實(shí)現(xiàn):
res.orderColorDeliveryRecords.forEach((item) => { item.money = this.actionOperationResult(item.price , item.amount); if(!item.cusTypeName){ item.cusTypeName = 'N/A'; } this.record.money += parseFloat(item.money); });
界面顯示:
小結(jié):
該解決方法只適用于低精度運(yùn)算。并且有弊端,就如上圖界面顯示一樣,最終運(yùn)算結(jié)果是沒有小數(shù)位的,還是將小數(shù)位給顯示出來的。如果不在乎這些還是可以使用的。
解決方法2(高精度):
先將運(yùn)算值 x 10^n 轉(zhuǎn)換成整數(shù)進(jìn)行運(yùn)算,最后將結(jié)果還原。精度要求高的推薦使用該解決方法。(代碼實(shí)現(xiàn)只實(shí)現(xiàn)了乘法,需要其他運(yùn)算的可以自行更改一下)
代碼實(shí)現(xiàn):
actionOperationResult(val1, val2){ const p = this.actionOperation(val1, val2); return ((val1 * p) * (val2 * p)) / (p * p); }, actionOperation(val1, val2){ const len1 = val1.toString().length - val1.toString().indexOf(".") - 1; const len2 = val2.toString().length - val2.toString().indexOf(".") - 1; const p = Math.max(len1, len2); // 避免最終求出結(jié)果的長(zhǎng)度大于最大長(zhǎng)度的時(shí)候?qū)е戮葋G失 開啟下面 // p += p - Math.min(len1, len2); return Math.pow(10, p); }
測(cè)試1:
item.money = this.actionOperationResult(item.price , item.amount);
界面顯示:
測(cè)試2:
const test = this.actionOperationResult(123.456789435252 , 42.697894); const test1 = this.actionOperationResult(4342.57897 , 64789.337489); const test2 = this.actionOperationResult(78.7897398 , 67.768978943); console.log("test:",test); console.log("test1:",test1); console.log("test2:",test2);
輸出結(jié)果:
小結(jié):
該解決方法適用于高精度運(yùn)算,既解決了精度丟失問題,又解決了我想要的最終結(jié)果是整數(shù)不顯示小數(shù)位的問題。如果要求高精度請(qǐng)選擇該解決方案。
到此這篇關(guān)于js運(yùn)算精度丟失的2個(gè)解決方法的文章就介紹到這了,更多相關(guān)js運(yùn)算精度丟失內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
javascript 樹形導(dǎo)航菜單實(shí)例代碼
本文章來給大家提供一款適用于網(wǎng)站后臺(tái)的使用的javascript 樹形導(dǎo)航菜單特效代碼,有需要了解的同學(xué)可以參考一下2013-08-08javascript使用中為什么10..toString()正常而10.toString()出錯(cuò)呢
在JavaScript中為什么10..toString()正常,而10.toString()出錯(cuò)呢?這個(gè)問題一直困擾著我,所抽時(shí)間搜集整理下,曬出來與大家分享感興趣的朋友可以了解下,希望對(duì)你們有幫助2013-01-01JavaScript?邏輯且(&&)和邏輯或(||)的運(yùn)用小結(jié)
這篇文章主要介紹了JavaScript?邏輯且(&&)和邏輯或(||)的妙用?,通過實(shí)例代碼介紹了邏輯且(&&)和邏輯或(||)的詳細(xì)用法,需要的朋友可以參考下2022-09-09JS中的.length屬性和.size()方法的區(qū)別
length是js原生屬性,size()是jQuery方法,如果你只是想獲取元素的個(gè)數(shù),兩者效果一樣既.length和.size()獲取的值是一樣的2024-08-08JS實(shí)現(xiàn)課堂隨機(jī)點(diǎn)名和順序點(diǎn)名
這篇文章主要介紹了基于JS實(shí)現(xiàn)課堂隨機(jī)點(diǎn)名和順序點(diǎn)名的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下2017-03-03JavaScript實(shí)現(xiàn)使用Canvas繪制圖形的基本教程
本篇文章主要介紹了JavaScript實(shí)現(xiàn)使用Canvas繪制圖形的基本教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2016-10-10