2017-10-09 43 views
1

JavaScript中是否有內置的功能,允許您在不擴展的情況下獲得某個數字的最小增量?例如:查找數字的最小增量

var i = 0.0003412 
smallest increment = 0.0000001 

var j = 0.011 
smallest increment = 0.001 

可以計算長度並在最後拋出1,當然。但是有更好的方法嗎?

+0

這是什麼「擴展它」是什麼意思? – phuzi

+0

爲什麼.001是0.011的最小增量?爲什麼不是0.00000000000001例如? – jrook

+0

@phuzi它意味着什麼在你的下面的評論問。我不想擴大一定數量的數字。我想根據給出的數字的數量來計算出,最小的增量是多少。 –

回答

0

如果這是你的問題,沒有內置函數。你將不得不自己想出一個解決方案。例如:

Math.pow(0.1, String(num).split('.')[1].length) 
0

解析值的另一種方法。

function smallestIncrement(nr) { 
 
    if (nr < 0) nr = -nr; 
 
    let str = nr.toExponential(), 
 
    e = str.indexOf("e"); 
 

 
    return Number("1e" + (str.substr(e + 1) - Math.max(0, e - 2))); 
 
} 
 
//just for completeness 
 
function biggestIncrement(nr) { 
 
    if (nr < 0) nr = -nr; 
 
    let str = nr.toExponential(); 
 
    return Number("1" + str.substr(str.indexOf("e"))) 
 
} 
 

 
//floating point math has issues. like: 
 
//0.1 + 0.2 === 0.30000000000000004 
 
function fixFloat(v){ 
 
    return Math.round(v/1e-14)*1e-14; 
 
} 
 

 
[ 
 
    0.0003412, 
 
    -3000, 
 
    12.340, 
 
    0.000000
 
].forEach(nr => { 
 
    console.log(
 
    nr, 
 
    fixFloat(nr+smallestIncrement(nr)), 
 
    fixFloat(nr+biggestIncrement(nr)) 
 
); 
 
})
.as-console-wrapper { 
 
    top: 0; 
 
    max-height: 100%!important 
 
}

你說,對於沒有小數位值,你想步爲1

我沒有補充說進入功能,因爲我沒有看到,如何/爲什麼在1.234e-101.234e+10之間的邏輯應該有所不同。
您可以通過執行簡單的Math.min(1, smallestIncrement(nr))或將代碼更改爲return Number("1e" + Math.min(0, str.substr(e + 1) - Math.max(0, e - 2)));