摘要:但是在測試中出現(xiàn)了的問題。查了下資料發(fā)現(xiàn)是因為浮點數(shù)的存儲產(chǎn)生的問題。失去準(zhǔn)確性的原因關(guān)于浮點數(shù)的存儲我了解不多,這里推薦這個文章給需要的同學(xué)浮點數(shù)陷阱及解法。注意返回的結(jié)果都是字符串。
前言
最近的兩個項目中都有涉及到數(shù)據(jù)統(tǒng)計的部分,一般來說金額的數(shù)據(jù)都是選擇保存2位小數(shù),以前是使用JavaScript原生對象Number的toFixed方法。但是在測試中出現(xiàn)了3.235.toFixed(2) = 3.23的問題。查了下資料發(fā)現(xiàn)是因為浮點數(shù)的存儲產(chǎn)生的問題。最后就自己封裝了一個函數(shù)來解決這個問題。
1. toFixed失去準(zhǔn)確性的原因關(guān)于浮點數(shù)的存儲我了解不多,這里推薦這個文章給需要的同學(xué)JavaScript 浮點數(shù)陷阱及解法。
2. 封裝toFixed 2-1 實現(xiàn)思路大體的思路是先分2部分,一是整數(shù)部分。整數(shù)部分不需要對值進(jìn)行修改,為了和Number.toFixed保持一致,需要補上對應(yīng)的0 (8.toFixed(2) => 8.00);
小數(shù)部分要做3個判斷,當(dāng)前小數(shù)后位數(shù)與要保存的位數(shù)進(jìn)行比較。等于的直接返回,當(dāng)前小數(shù)后位數(shù)小于要保存的位數(shù)就舍棄掉多余的部分。最后一種情況要針對正負(fù)數(shù)進(jìn)行不同的處理,詳情見下方代碼。
注意:返回的結(jié)果都是字符串。
2-2 代碼let tofixed = (value, holdLen) => { value = value.toString(); let dotIndex = value.indexOf("."); //判斷是否為整數(shù) if (dotIndex === -1) { //少幾位就補幾位0 let integerStr = "."; for (let i = 0; i < holdLen; i++) { integerStr = integerStr + "0"; } return value + integerStr; } //獲取小數(shù)點前后的字符串 let dotBefore = value.split(".")[0]; let dotAfter = value.split(".")[1]; //小數(shù)點后與要保留的位數(shù)進(jìn)行判斷出來 let result = ""; if (dotAfter.length === holdLen) { result = value; } else if (dotAfter.length < holdLen) { let forlength = holdLen - dotAfter.length //少幾位就補幾位0 for (let i = 0; i < forlength; i++) { dotAfter = dotAfter + "0"; } result = dotBefore + "." + dotAfter; } else { //獲取到要四舍五入的位置后一個數(shù)字的值 let digit = value.substr(dotIndex + holdLen + 1, 1); if (digit >= 5) { let temp = Math.pow(10, 0 - holdLen); //負(fù)數(shù)和正數(shù)的四舍五入判斷 parseFloat(value) > 0 ? value = parseFloat(value) + temp : value = parseFloat(value) - temp; value = value.toString(); } result = value.substr(0, dotIndex + holdLen + 1); } return result; } console.log(tofixed(1.335, 2)); console.log(tofixed(2.1, 3)); console.log(tofixed(-8.546, 2)); console.log(tofixed(-9, 3)); //打印結(jié)果 "1.34" "2.100" "-8.55" "-9.000"
我的處理辦法很粗糙,希望各位多多給出意見。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/99890.html
概念: 平穩(wěn)退化 漸進(jìn)增強 以用戶為中心 第一章 js簡史 可以使用DOM(Document Object Model)給HTML(HyperText Markup Language)文檔增加交互能力,就像CSS(Cascading Style Sheet)給文檔增加樣式一樣。DOM是一種API(Application Programing Interface),就是一種已得到各方認(rèn)同的基本約...
摘要:進(jìn)制之謎眾所周知,計算機在設(shè)計之初,出于各方面角度考慮,最終采用二進(jìn)制的格式來存儲數(shù)據(jù)。同樣的情況,也會出現(xiàn)在十進(jìn)制和二進(jìn)制的轉(zhuǎn)換中。當(dāng)我們在計算機中,聲明一個變量為,其實該數(shù)字作為二進(jìn)制保存在計算機中,并不真的是。 前言 經(jīng)常使用JavaScript用來處理數(shù)字的程序員都知道,JavaScript的Number.toFixed,這一函數(shù),在格式化數(shù)字時,會自動進(jìn)行四舍五入,例如: 1...
摘要:另外,這幾篇幾個不錯的隨機生成隨機數(shù)采用對獲取的浮點數(shù)進(jìn)行取整操作,也是同樣的問題,能取到左端點,卻無法取到右端點。 最近在琢磨內(nèi)置對象Math的時候,參考了很多網(wǎng)上資料,不過我在Google中搜索js 隨機整數(shù),出來很多博客文章,很遺憾,在我看來排名靠前的這些文章都是錯誤的。接下來我將會論證我這一觀點,同時把我所理解的Math.random()方法跟你分享。showImg(https...
摘要:方法使用定點表示法來格式化一個數(shù),會對結(jié)果進(jìn)行四舍五入。該數(shù)值在必要時進(jìn)行四舍五入,另外在必要時會用來填充小數(shù)部分,以便小數(shù)部分有指定的位數(shù)。如果數(shù)值大于,該方法會簡單調(diào)用并返回一個指數(shù)記數(shù)法格式的字符串。在環(huán)境中,只能是之間,測試版本為。 showImg(https://segmentfault.com/img/remote/1460000011913134?w=768&h=521)...
摘要:前言最近,朋友問了我這樣一個問題在中的運算結(jié)果,為什么是這樣的雖然我告訴他說,這是由于浮點數(shù)精度問題導(dǎo)致的。由于可以用階碼移動小數(shù)點,因此稱為浮點數(shù)。它的實現(xiàn)遵循標(biāo)準(zhǔn),使用位精度來表示浮點數(shù)。 showImg(https://segmentfault.com/img/remote/1460000018981071); 前言 最近,朋友 L 問了我這樣一個問題:在 chrome 中的運算...
閱讀 3179·2023-04-25 19:09
閱讀 3888·2021-10-22 09:54
閱讀 1764·2021-09-29 09:35
閱讀 2919·2021-09-08 09:45
閱讀 2264·2021-09-06 15:00
閱讀 2775·2019-08-29 15:32
閱讀 1042·2019-08-28 18:30
閱讀 376·2019-08-26 13:43