Autor | Zpráva | ||
---|---|---|---|
Gogo_v Profil |
#1 · Zasláno: 27. 1. 2014, 21:20:31
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 |
#3 · Zasláno: 27. 1. 2014, 21:29:05
Něco takového?
|
||
Gogo_v Profil |
#4 · Zasláno: 27. 1. 2014, 21:35:36
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 |
#5 · Zasláno: 27. 1. 2014, 21:38:06
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 |
#7 · Zasláno: 27. 1. 2014, 22:08:24
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 |
#9 · Zasláno: 28. 1. 2014, 12:24:38
_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 |
#10 · Zasláno: 28. 1. 2014, 13:05:11
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 |
#13 · Zasláno: 28. 1. 2014, 14:05:04
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 float y 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 |
#14 · Zasláno: 28. 1. 2014, 15:58:19
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 |
#15 · Zasláno: 28. 1. 2014, 16:23:07
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. |
||
Časová prodleva: 10 let
|
0