Autor Zpráva
miamia
Profil
zdravím všetkých,
zistil som, že takáto vec Math.floor( 100.05/(5/100) ) vráti výsledok 2000 namiesto 2001.
ale na počudovanie toto Math.floor( 10.05/(5/100) ) vráti správnu hodnotu 201.

Neviete prečo mi to pri vyšších číslach zle počíta?

vďaka vopred
Chamurappi
Profil
Reaguji na miamiu:
Viz Výsledkem výpočtu 1 - 0.9 není přesně 0.1. Dělení 100.05/(5/100) vyjde (nejen v JavaScriptu) 2000.9999999999998, což je při zaokrouhlení dolu 2000.
miamia
Profil
vďaka Chamurappi, to som teda nečakal. a dá sa to prosím nejako uspokojivo ošetriť?
_es
Profil
miamia:
dá sa to prosím nejako uspokojivo ošetriť?
Zobrazovať čísla len s menšou presnosťou než umožňuje ich zápis v IEEE 754, teda vhodne zaokrúhľovať výsledky.
nemeja
Profil
Muzes pouzit fci round(). ta ti to zaokrouhli nahoru
Filipkoss
Profil
miamia:
I když to není problém Math.floor(), tak doporučují místo:
Math.floor(a)
používat
~~a
Je to rychlejší, stručnější, a samotná vlnovka se hodí při indexOf:
if(a.indexOf(b)==0) => if(~a.indexOf(b))
Je to operátor BITWISE NOT, vlastně ~a == Math.floor(-i-1)
_es
Profil
[#6] Filipkoss:
To nie je dobré používať, lebo sa tým zmenší rozsah čísel na 32 bitové celé čísla:
alert(Math.floor(3e9)) // 3000000000
alert(~~(3e9)) // -1294967296
Chamurappi
Profil
Reaguji na Filipkosse:
Je to rychlejší, stručnější
Rozdíl v rychlosti není zase tak zásadní a člověk si musí dávat pozor, aby byl v intervalu [0; 2147483648]. Na záporná čísla vyšší než -2^31 fungují bitové operátory jako Math.ceil.

if(a.indexOf(b)==0) => if(~a.indexOf(b))
Špatně. První podmínka je true pouze tehdy, pokud je b na začátku a, druhá vyjde kladně, kdykoliv je b uvnitř a.

Vaše odpověď

Mohlo by se hodit

Neumíte-li správně určit příčinu chyby, vkládejte odkazy na živé ukázky.
Užíváte-li nějakou cizí knihovnu, ukažte odpovídajícím, kde jste ji vzali.

Užitečné odkazy:

Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0