需求:對浮點數進行四舍五入精度獲取。
問題:直接使用Number.toFixed()會出現異常的舍入情況。
原因:計算機浮點數存儲是二進制,js的Number.toFixed()實際的精度確認規則是四舍六入五成雙,逢四下舍,逢六入一,逢五時,根據瀏覽器內核計算結果也不盡相同。
具體原理這里不做詳細描述,各位看官可自行查閱相關資料。
解決方法:重新Number.toFixed()方法。
實現原理:將浮點數轉化為整數,保留所需位數,再轉為浮點數。
實現代碼:
1 Number.prototype.toFixed = function (length) { 2 var s = this + ''; 3 var len = length || 0; 4 var result = s; 5 var arr = s.split('.'); 6 7 //整數 8 if (arr.length < 2) { 9 if (len > 0) { 10 result += '.'; 11 for (var i = 1; i <= len; i++) { 12 result += '0'; 13 } 14 } 15 return result; 16 } 17 18 //小數 19 var first = arr[0]; 20 var second = arr[1]; 21 22 //小數點位數等於length 23 if (second.length == len) { 24 return result; 25 } 26 27 //小數點位數小於length 28 if (second.length < len) { 29 for (var k = 1; k <= len - second.length; k++) { 30 result += '0'; 31 } 32 return result; 33 } 34 35 //小數點位數大於length 36 result = first + second.substr(0, len + 1); 37 var last = Math.floor((result * 1 + 5) / 10); 38 result = (last / Math.pow(10, len)).toFixed(len); 39 return result; 40 };
備注:解決方案有很多種,這只是個人的理解,僅供參考。
