摘要:我們可以利用該函數(shù)限定返回數(shù)值的位數(shù),從而達到提高精度的效果。
一、問題的引入
今天在看基礎js文章的時候發(fā)現(xiàn)了一個浮點數(shù)的精度問題,當打印小數(shù)相加的時候有時候會出現(xiàn)數(shù)值不準確的情況,如果是在做一些需要數(shù)據(jù)精度要求較高的工作的時候稍有不慎就會出現(xiàn)問題
console.log(0.1+0.1) //0.2 console.log(0.1+0.2) //0.30000000000000004(精度最高保留到17位)
查閱資料之后,發(fā)現(xiàn)是因為像 0.1+0.2這樣的操作對于計算機來說轉換為二進制之后將是兩個無限循環(huán)的數(shù)。而對于計算機而言是不允許有無限的,進行四舍五入之后雙精度浮點數(shù)保留52位,結果為0.0100 1100 1100 1100 1100 1100 1100 1100 1100 1100 1100 1100 1100轉為十進制就是0.30000000000000004
二、基本解決方法【1】利用toFixed(digits)
toFixed函數(shù)在digits參數(shù)存在的情況下返回一個所給數(shù)值的定點數(shù)表示法的字符串(digits要在0-20之間,默認為0)。我們可以利用該函數(shù)限定返回數(shù)值的位數(shù),從而達到提高精度的效果。
var floatNum=0.1+0.2; console.log(floatNum); //0.30000000000000004 console.log(floatNum.toFixed(2)) //0.30 console.log(1.35.toFixed(1)) //1.4 console.log(1.33335.toFixed(4)); //1.3334
在這里我們看上去是解決了問題,但是和直接進行相加一樣有時候toFixed 也會有問題
Chrome: console.log(1.55.toFixed(1));// 1.6 console.log(1.555.toFixed(2));//1.55 console.log(1.5555.toFixed(3));//1.556
關于這個問題,MDN上函數(shù)的描述為 “該數(shù)值在必要時進行四舍五入,另外在必要時會用 0 來填充小數(shù)部分,以便小數(shù)部分有指定的位數(shù)?!敝劣谑窃趺炊x“必要”的,不同的瀏覽器會有不同的情況。
IE: console.log(1.55.toFixed(1)); //1.6 console.log(1.555.toFixed(2)); //1.56 console.log(1.5555.toFixed(3)); //1.556
【2】重寫toFixed函數(shù)
思路為放大原有的數(shù)據(jù),利用整數(shù)的整除來避免精度丟失
function toFixed(num, s) { if(typeof s==="undefined"){ return parseInt(num)+""; } if(typeof s!=="number"){ return "請正確輸入保留位數(shù)(數(shù)字)"; } var times = Math.pow(10, s); var newNum = num * times+0.5;//加0.5是為了實現(xiàn)四舍五入中"入"的那0.5 newNum = parseInt(newNum) / times; return newNum + ""http://toFixed返回的是字符類型的數(shù)據(jù) } console.log(toFixed(1.5)) //2 console.log(toFixed(1.55,1)) //1.6 console.log(toFixed(1.555,2)) //1.56 console.log(toFixed(1.5555,3)) //1.556
【3】基礎運算自實現(xiàn)
function getDecimalLength(num){ //獲取小數(shù)位長度 let length=0; try{ length =String(num).split(".")[1].length }catch(e){ //TODO handle the exception } return length; } function getBeishu(num1,num2){ //獲取放大倍數(shù) let num1DecimalLength=getDecimalLength(num1); let num2DecimalLength=getDecimalLength(num2); let longer=Math.max(num1DecimalLength,num2DecimalLength); return Math.pow(10,longer); } //加減乘除算法 function add(num1,num2){ let beishu=getBeishu(num1,num2); return (num1*beishu+num2*beishu)/beishu; } function sub(num1,num2){ let beishu=getBeishu(num1,num); return (num1*beishu-num2*beishu)/beishu; } function mul(num1,num2){ let num1DecLen=getDecimalLength(num1); let num2DecLen=getDecimalLength(num2); let num1toStr=String(num1); let num2toStr=String(num2); return Number(num1toStr.replace(".",""))*Number(num2toStr.replace(".",""))/Math.pow(10,num1DecLen+num2DecLen) } function dev(num1,num2){ let num1DecLen=getDecimalLength(num1); let num2DecLen=getDecimalLength(num2); let num1toStr=String(num1); let num2toStr=String(num2); return Number(num1toStr.replace(".",""))/Number(num2toStr.replace(".",""))/Math.pow(10,num1DecLen-num2DecLen) }
文章版權歸作者所有,未經(jīng)允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://systransis.cn/yun/103087.html
摘要:前言最近,朋友問了我這樣一個問題在中的運算結果,為什么是這樣的雖然我告訴他說,這是由于浮點數(shù)精度問題導致的。由于可以用階碼移動小數(shù)點,因此稱為浮點數(shù)。它的實現(xiàn)遵循標準,使用位精度來表示浮點數(shù)。 showImg(https://segmentfault.com/img/remote/1460000018981071); 前言 最近,朋友 L 問了我這樣一個問題:在 chrome 中的運算...
摘要:而的浮點數(shù)設置的偏移值是,因為指數(shù)域表現(xiàn)為一個非負數(shù),位,所以,實際的,所以。這是因為它們在轉為二進制時要舍入部分的不同可能造成的不同舍 IEEE 754 表示:你盡管抓狂、罵娘,但你能完全避開我,算我輸。 一、IEEE-754浮點數(shù)捅出的那些婁子 首先我們還是來看幾個簡單的問題,能說出每一個問題的細節(jié)的話就可以跳過了,而如果只能泛泛說一句因為IEEE754浮點數(shù)精度問題,那么下文還是...
摘要:本文通過介紹的二進制存儲標準來理解浮點數(shù)運算精度問題,和理解對象的等屬性值是如何取值的,最后介紹了一些常用的浮點數(shù)精度運算解決方案。浮點數(shù)精度運算解決方案關于浮點數(shù)運算精度丟失的問題,不同場景可以有不同的解決方案。 本文由云+社區(qū)發(fā)表 相信大家在平常的 JavaScript 開發(fā)中,都有遇到過浮點數(shù)運算精度誤差的問題,比如 console.log(0.1+0.2===0.3)// fa...
摘要:又如,對于,結果其實并不是,但是最接近真實結果的數(shù),比其它任何浮點數(shù)都更接近。許多語言也就直接顯示結果為了,而不展示一個浮點數(shù)的真實結果了。小結本文主要介紹了浮點數(shù)計算問題,簡單回答了為什么以及怎么辦兩個問題為什么不等于。 原文地址:為什么0.1+0.2不等于0.3 先看兩個簡單但詭異的代碼: 0.1 + 0.2 > 0.3 // true 0.1 * 0.1 = 0.01000000...
摘要:基于這個問題運動基礎問題,我想應該也有一部分人沒有認真對待過中浮點數(shù)的四則運算出現(xiàn)的問題。解決方案引自解決方案為了解決浮點數(shù)運算不準確的問題,在運算前我們把參加運算的數(shù)先升級的的次方到整數(shù),等運算完后再降級的的次方。 基于這個問題:javascript運動基礎問題 ,我想應該也有一部分人沒有認真對待過js中浮點數(shù)的四則運算出現(xiàn)的問題。 1.問題描述 示例代碼: var x ...
閱讀 3028·2023-04-26 01:32
閱讀 1615·2021-09-13 10:37
閱讀 2359·2019-08-30 15:56
閱讀 1746·2019-08-30 14:00
閱讀 3172·2019-08-30 12:44
閱讀 2015·2019-08-26 12:20
閱讀 1149·2019-08-23 16:29
閱讀 3296·2019-08-23 14:44