Autor Zpráva
Gogo_v
Profil
Dobrý večer potřeboval bych poradit jak zaokrouhlit libovolné číslo aby byl výsledek vždy zaokrouhlen na desítky a to směrem dolů
Takže číslo 299 = 290 , 302 = 300 , 309 = 300, 310 = 310, 311 = 310 atd.
Vím že je v javascriptu funkce Math.round ale nepřišel jsme na to jak udělat to zaokrouhlení :(
Děkuji moc za radu a pěkný večer
juriad
Profil
Gogo_v:
Stačí trocha aritmetiky a funkce Math.floor.
var cislo = 299;
var zaokrouhlene = Math.floor(cislo/10)*10;
alert(zaokrouhlene);
Someone
Profil
Něco takového?
Gogo_v
Profil
Dobrý večer. To jsem zkoušel ale nedělá to výsledek který jsem chtěl, řešení je pravděpodobně
var cislo = 165;
var vysledek = Math.floor(cislo * 0.1) / 0.1;
alert(vysledek);

Výsledek = 160
juriad
Profil
Gogo_v:
To, co jsme napsali my je ekvivalentní tomu tvému.
Násobení 0.1 je to samé jako dělení deseti a dělení 0.1 je násobení 10.

Nejspíš jsi to jen špatně napsal.
Gogo_v
Profil
Omlouvám se funguje to jsem idiot měl jsem špatně operátor * / ... přehodil sem si to. Děkuju moc za pomoc Váš kód samozřejmě dělá přesně co jsem chtěl. A kdybych nebyl trotl tak ani jsem nemusel otravovat :) Díky moc za pomoc. Pěkný večer
Joker
Profil
juriad:
Násobení 0.1 je to samé jako dělení deseti a dělení 0.1 je násobení 10.
Pozor, vzhledem k nedokonalé přesnosti reálných čísel to stejné být nemusí.
Když v nějaké situaci lze použít více matematicky ekvivalentních výpočtů, doporučuji preferovat ten, který vede k operacím v pevné řádové čárce.

Tzn. raději Math.floor(cislo/10)*10, než Math.floor(cislo * 0.1) / 0.1.
V tomhle konkrétním případě by sice asi problém nenastal, ale viz například:
alert(0.7 * 10); // 7
alert(0.7 / 0.1); // 6.999999999999999
_es
Profil
Joker:
Ten konkrétny príklad je len ukážka toho, že niekedy sa nepresné počítanie s necelými číslami prejaviť môže a niekedy nemusí. V tom príklade ani 0.7 ani 0.1 v skutočnosti nie sú presne 0,7 a 0,1. V prvom príklade len násobenie 10 „náhodou“ odstráni nepresnosť zápisu 0.7. Je to vidno z príkladu:
alert(0.7 / 10); // 0.06999999999999999
alert(0.7 * 0.1); // 0.06999999999999999
Joker
Profil
_es:
Možná to není dost zdůrazněné:
Ten příklad je ukázka toho, že x * 10 nemusí být totéž, jako x / 0.1.
Nejde samozřejmě o demonstraci výpočtu v pevné a pohyblivé čárce, oba výpočty jsou v pohyblivé čárce.

Jinak upřímně řečeno si nejsem jistý, jak vlastně tohle v JavaScriptu (kde všechna čísla jsou typu number) funguje.
Ale třeba v PHP výsledkem floor($cislo / 10) * 10 bude integer, zatímco výsledkem floor($cislo * 0.1) / 0.1 bude float.
Obecně je lepší volit výpočet, který vede na integer.
1Pupik1989
Profil
V javascriptu bude float * int zase float.

0.612 * 100 = 61.199999999999996

kdežto

0.612 * 10 * 10 = 61.2

Úplně stejně je na tom dělení.
Joker
Profil
1Pupik1989:
V javascriptu bude float * int zase float.
Ale Math.floor(cislo/10)*10 není float * int, ale int * int.

edit: Špatný kód.
_es
Profil
1Pupik1989:
V javascriptu bude float * int zase float.
Joker:
Ale Math.floor(cislo/10)*10 není float * int, ale int * int.
V JavaScripte je len jeden číselný dátový typ - rovnaký ako trebárs v C typ double.

1Pupik1989:
Ten príklad len demonštruje, že teoreticky rovnaké operácie nemusia dať rovnaký výsledok, pracuje sa i s trochu inými číslami než by zodpovedali ich dekadickému zápisu. 0.612 v skutočnosti nie je 0,612 a ani výsledok 61.2 v skutočnosti nie je 61,2 (v druhom výsledku).
Chamurappi
Profil
Reaguji na _es:
rovnaký ako trebárs v C typ double
Ano, je to přesně céčkový double, oficiálně binary64 podle IEEE 754.
Pokud dobře hledám, tak to, čemu se v PHP říká float, je ve skutečnosti také double (na rozdíl od jiných jazyků, kde float bývá obvykle single). Takže by výpočty s floaty v PHP měly vycházet přesně stejně, jako výpočty v JS.

0.612 v skutočnosti nie je 0,612
Přesně tak, programátor sice napíše 0.612, ale v paměti je to číslo pak uložené jako 0,61199999999999998845368054389837197959423065185546875 (což se při běžném výpisu zaokrouhlí zpátky na 0.612).
Joker
Profil
Chamurappi:
Pokud dobře hledám, tak to, čemu se v PHP říká float, je ve skutečnosti také double
Ano, PHP tomu říká float, double nebo real, ale je to 64-bitový double.

Já právě nevěděl, když JS má jen typ number, jestli dělá rozdíl mezi celými a reálnými čísly.

Přesto ale i tak trvá moje doporučení obecně, pokud je na výběr, upřednostnit variantu výpočtu, která vede k operacím s celými čísly.
A související doporučení: Je-li na výběr, upřednostnit variantu výpočtu s podobným řádem všech mezivýsledků před variantou, kde se řád mezivýsledku v některých krocích dramaticky mění.
_es
Profil
Joker:
Já právě nevěděl, když JS má jen typ number, jestli dělá rozdíl mezi celými a reálnými čísly.
Nerobí rozdiel. Akurát bitové operátory pracujú skryto s 32 bitovými celými číslami, no výsledok je aj tak rovnakého typu ako iné čísla.

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