當(dāng)前位置:
首頁 >
前端技术
> javascript
>内容正文
javascript
JavaScript四舍五入的改进
生活随笔
收集整理的這篇文章主要介紹了
JavaScript四舍五入的改进
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
前言
最近的兩個項(xiàng)目中都有涉及到數(shù)據(jù)統(tǒng)計的部分,一般來說金額的數(shù)據(jù)都是選擇保存2位小數(shù),以前是使用JavaScript原生對象Number的toFixed方法。但是在測試中出現(xiàn)了3.235.toFixed(2) = 3.23的問題。查了下資料發(fā)現(xiàn)是因?yàn)楦↑c(diǎn)數(shù)的存儲產(chǎn)生的問題。最后就自己封裝了一個函數(shù)來解決這個問題。
1. toFixed失去準(zhǔn)確性的原因
關(guān)于浮點(diǎn)數(shù)的存儲我了解不多,這里推薦這個文章給需要的同學(xué)JavaScript 浮點(diǎn)數(shù)陷阱及解法。
2. 封裝toFixed
2-1 實(shí)現(xiàn)思路
- 大體的思路是先分2部分,一是整數(shù)部分。整數(shù)部分不需要對值進(jìn)行修改,為了和Number.toFixed保持一致,需要補(bǔ)上對應(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) {//少幾位就補(bǔ)幾位0let integerStr = ".";for (let i = 0; i < holdLen; i++) {integerStr = integerStr + '0';}return value + integerStr;}//獲取小數(shù)點(diǎn)前后的字符串let dotBefore = value.split(".")[0];let dotAfter = value.split(".")[1];//小數(shù)點(diǎn)后與要保留的位數(shù)進(jìn)行判斷出來let result = "";if (dotAfter.length === holdLen) {result = value;} else if (dotAfter.length < holdLen) {let forlength = holdLen - dotAfter.length//少幾位就補(bǔ)幾位0for (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"我的處理辦法很粗糙,希望各位多多給出意見。
總結(jié)
以上是生活随笔為你收集整理的JavaScript四舍五入的改进的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: GSON的使用以及GsonFormat工
- 下一篇: [译]Effective Kotlin系