Snažím sa použiť číslo ako percento _.round
a potom vynásobením čísla číslom 100. Z nejakého dôvodu, keď vynásobím zaokrúhlené číslo, precíznosť sa zhoršuje. Tu je to, ako to vyzerá:
var num = 0.056789,
roundingPrecision = 4,
roundedNum = _.round(num, roundingPrecision),
percent = (roundedNum * 100) + "%";
console.log(roundedNum); // 0.0568
console.log(percent); // 5.680000000000001%
Prečo je hodnota 0.000000000000001 pridaná k číslu po vynásobení číslom 100?
odpovede:
7 pre odpoveď č. 1Je to spôsobené tým, že čísla sú reprezentované vnútorne ako binárne čísla s obmedzenou presnosťou.
Pozri tiež "Je matematika s pohyblivou čiarou rozbitá?"
Je matematika s plávajúcou desatinnou čiarkou zlomená?
0,1 + 0,2 == 0,3 -> false
0,1 + 0,2 -> 0,30000000000000004
Akékoľvek nápady, prečo sa to stane?
Ktorý dostal odpoveď:
dvojitý pohyblivou čiarkou matematika je taká. Vo väčšine programovacích jazykov je založená na Norma IEEE 754, JavaScript používa 64-bitové zobrazenie s pohyblivou čiarou, čo je rovnaké ako Java
double
, Kľúčom problému je, že čísla sú v tomto formáte reprezentované ako celé číslo, a síce dva; racionálne čísla (napr0.1
, ktorý je1/10
), ktorého menovateľ nie je mocou dvoch, nemôže byť presne zastúpený.
Ak chcete získať správny výsledok vo vašom prípade, musíte sa zaobchádzať po všetky aritmetické:
var num = 0.056789,
roundingPrecision = 4,
roundedNum = _.round(num * 100, roundingPrecision),
percent = roundedNum + "%";
console.log(percent); // 5.0569%
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/3.10.1/lodash.min.js"></script>