Autor Zpráva
candyman
Profil
Ahojte, som začiatočník v javascriptoch a nejkým zázrakom sa mi podarilo dať dokopy túto kalkulačku. Problém je v tom, že keď zadám číslo s desatinou čiarkou a nie bodkou, tak to neprepočíta. Viem, že je na to funkcia str_replace, ale absolútne netuším, ako by som ju v tomto mojom prípade použil, aby mi to fungovalo. Prosím Vás o pomoc. Vopred veľmi pekne ďakujem

<script language="javascript" type="text/javascript">


function masskalkulacka(form) {  

var vyska_investicie;
var pozadovana_navratnost;
var urokova_sadzba;
var cena_za_hru_dospely;
var percento_dospelych;
var cena_za_hru_dietata;
var percento_deti;
var priemerna_cena_hry;
var pocet_dni_prevadzy;
var min_hracov;
var pom_pow;
var a;
var b;
var c;
var e;
var pred_ceil;
var xxx;
var mmm;
var yyy;
var ttt;
var ggg;


form.percento_deti.value=100-form.percento_dospelych.value;

form.priemerna_cena_hry.value=((((form.cena_za_hru_dospely.value)*(form.percento_dospelych.value))+((form.cena_za_hru_dietata.value)*(form.percento_deti.value)))/100);


c=(form.urokova_sadzba.value/100);
a=1+c;
b=form.pozadovana_navratnost.value;
e=Math.pow(a,b);
form.pom_pow.value=e;
mmm=form.vyska_investicie.value*((e/b)/form.priemerna_cena_hry.value);
form.pred_ceil.value=mmm;
form.xxx.value=Math.ceil(mmm);
ggg=form.xxx.value;
ttt=ggg/form.pocet_dni_prevadzky.value;
form.yyy.value=Math.ceil(ttt);



return (false);  
} 
</script>

<form enctype="multipart/form-data" method="post" name="kalkulacka_moja" onsubmit="return masskalkulacka(this)"> 
<fieldset>  
    <table class="calculator_table" style="background: url('http://svedsky-minigolf.sk/kalkulacka_web.png');">  
<tr>    
<td style="width:20%; vertical-align:top; border-left: 1px solid gray;border-right: 1px solid gray;padding-left: 15px;
padding-right: 15px;">
<b style="padding-left: 48px;">Náklady</b> <br />
<p style="padding-top:10px; min-height:88px;">
Výška investície (cena ihriska):<br />
<input type="text"  size="10" name="vyska_investicie" value="0" /> <span style="position: relative;
top: -8px;left: -3px;">€</span>
</p>

<p style="min-height:88px;">
Požadovaná návratnosť (v rokoch):<br />
<input type="text"  size="10" name="pozadovana_navratnost" value="0" />
</p>

<p style="miin-height:88px;margin-bottom: 0px;">
Úroková sadzba úveru (v percentách):<br />
<input type="text"  size="10" name="urokova_sadzba" value="0" /><span style="position: relative;
top: -8px;">%</span>
</p>
</td>









<td style="width:20%; vertical-align:top; boarder-right: 1px solid gray;padding-left: 15px;
padding-right: 15px;">
<b style="margin-left: 134px; margin-right: -76px;">Výnosy</b> <br />
<p style="min-height:88px;padding-top: 10px;">
Cena za hru - dospelý:<br />
<input style="margin-top: 21px;" type="text"  size="10" name="cena_za_hru_dospely" value="0" /><span style="position: relative;
top: -8px;">€</span>
</p>

<p style="min-height:88px;">
Cena za hru - dieťa:<br />
<input style="margin-top: 20px;" type="text"  size="10" name="cena_za_hru_dietata" value="0" /><span style="position: relative;
top: -8px;">€</span>

</p>

<p style="miin-height:88px;margin-bottom: 0px;">
<span style="min-height:30px;">Priemerná cena hry:</span><br />
<input style="background-color: rgb(184, 184, 184);margin-top: 20px;" type="text"  size="10" name="priemerna_cena_hry" id="priemerna_cena_hry" value="" readonly /><span style="position: relative;
top: -8px;">€</span>
</p>


</td>

<td style="width:20%; vertical-align:top;border-right: 1px solid gray;padding-left: 15px;
padding-right: 15px;padding-top: 17px;">

<p style="min-height:88px;padding-top: 12px;">
Percento dospelých hráčov:<br />
<input type="text"  size="10" name="percento_dospelych" value="0" /><span style="position: relative;
top: -8px;">%</span>

</p>
<p style="min-height:88px;">
Percento detí:<br />
<input style="margin-top: 20px;background-color: rgb(184, 184, 184);" type="text"  size="10" name="percento_deti" id="percento_deti" readonly /><span style="position: relative;
top: -8px;">%</span>





</p>
<p style="miin-height:88px;margin-bottom: 0px;">
<span style="min-height:30px;">Počet dní prevádzky za rok:</span><br />
<input type="text"  size="10" name="pocet_dni_prevadzky" id="pocet_dni_prevazdky" value="0" />
</p>

</td>
<input style="display:none;" id="pocet_dni_prevazdky" type="text" name="pom_pow" size="10" value="0" />
<input style="display:none;" id="pred_ceil" type="text" name="pred_ceil" size="10" value="0" />


<td style="width:20%; vertical-align:top;border-right: 1px solid gray;padding-left: 15px;
padding-right: 15px;padding-top: 17px;">


<p style="min-height:88px;padding-top: 10px;">
<span style="min-height:30px;">Minimálny počet hráčov za rok, aby sa investícia vrátila</span><br />
<input style="background-color: rgb(185, 68, 68);color:white;" type="text"  size="10" name="xxx" id="xxx" value="" readonly />
</p>

<p style="min-height:88px;">
Minimálny počet hráčov za deň, aby sa investícia vrátila:<br />
<input style="background-color: rgb(185, 68, 68);color:white;" type="text"  size="10" name="yyy" id="yyy" value="" readonly />
</p>

<p style="miin-height:88px;margin-bottom: 0px;">
<input style="background-color: #42d056;
padding: 7px;
color: white;
margin-top: 3px;
width: 81px;
height: 61px;
font-weight: bold; cursor:pointer;border-radius:3px;" type="submit" value="Vypočítať" onClick="" > 

</p>

</td>
</tr>
</table>
<p style="padding-top: 10px;
margin-bottom: -17px;">* vyplňte bielo podfarbené polia a kliknite na "Vypočítať"</p>

     
  </fieldset>  
  </form>  

Moderátor Chamurappi: Titulek „problém - kalkulačka“ nevystihoval podstatu dotazu. Příště zkus prosím vymyslet lepší. Když ti diskuse poradí, že máš popsat problematický děj, popiš problematický děj.
Enyeus
Profil
Vzhledem k tomu, že neukládáš hodnotu value do proměnné, ale rovnou ji používáš, tak použij něco jako toto na všechny inputy:
<input type="text"  size="10" name="vyska_investicie" value="0" 
onkeyup="this.value = this.value.replace(',','.')" />
Chamurappi
Profil
Reaguji na Enyea:
To je ošklivé. Proč měnit člověku text pod rukama? On to přeci zadává správně, není důvod ho nějak převychovávat.


Reaguji na candymana:
Ten value.replace, který poradil Enyeus, prováděj až ve funkci masskalkulacka.
joe
Profil
Chamurappi:
Abych nevytvářel nové téma, bude se to hodit tady. Neměl bys nějaký tip, jakým způsobem nakládat s zadanými čísly od uživatele? Protože JavaScript nepočítá přesně díky prezentaci čísel v binární soustavě, ale co s tím? Při takových kalkulačkách to pak může ukazovat trochu jiný výsledek, než bysme čekali.
Joker
Profil
joe:
JavaScript nepočítá přesně díky prezentaci čísel v binární soustavě
Ta nepřesnost není daná binární soustavou, ale tím, že reálných čísel je na jakémkoli použitelném* intervalu nekonečně mnoho, takže nelze konečně velkým množstvím paměti reprezentovat každé z nich.

ale co s tím?
Totéž, co s tím dělají kapesní kalkulačky: Stačí výsledek zaokrouhlit.
Pro většinu použití stačí i podstatně menší přesnost, než má JS (nevím jak to je v JS, ale neočekával bych velký rozdíl proti PHP, kde je přesnost myslím že 15 řádů od první nenulové číslice).


* Tzn. jakýkoliv který by obsahoval víc než jedno číslo.
Enyeus
Profil
Chamurappi:
Jelikož ale používá v JS přímo například form.percento_dospelych.value, aniž by to nejprve uložil do proměnné a až poté s hodnotou pracoval, tak bude pro něj jednodušší, když to implementuje jednou do HTML, než vícekrát do JS.
Chamurappi
Profil
Reaguji na joa:
S reprezentací čísel v JS jsem si během posledních měsíců užil spoustu zábavy :-)
Ale jen kvůli tomu, že jsem o ní psal článeček. Jinak jsem už vyráběl desítky kalkulaček (mzdových, penzijních, nemocenských, alkoholových, volebních) a všude jsem si vystačil s obyčejným zaokrouhlováním výsledků. Fakt je, že všechny výpočty bývaly jen orientační, při chybě by se žádná tragédie nestala. Nic opravdu důležitého jsem v JS nepočítal… a asi bych se i zdráhal provádět takové akce u klienta.

Jinak samozřejmě nějaká universální řešení existují, dají se dohledat hotové knihovny pro práci s velkými čísly, kde se operace provádějí na poli (z něhož jde sestavit číslo), i knihovny na racionální aritmetiku, kde se všechna desetinná čísla (vyjma iracionálních) ukládají v podobě zlomků (s celočíselnými částmi). Ovšem pro běžné používání je to kanon na vrabce.


Reaguji na Enyea:
tak bude pro něj jednodušší
Ale je to hnusné vzhledem k uživateli. To ať si raději vyrobí proměnnou. Nebo může ten replace dát rovnou za všechny value i v tom svém výpočtu.
Navíc tvůj postup neodchytne vložení čísla ze schránky (přes myš, ne přes Ctrl+V) nebo přetažením odjinud nebo vybráním z našeptávače, takže je to stejně polovičaté řešení.
joe
Profil
Joker:
Ta nepřesnost není daná binární soustavou, ale tím, že reálných čísel je na jakémkoli použitelném* intervalu nekonečně mnoho...
Přiznám se, že tomu moc nerozumím, vycházel jsem z některé odpovědi na stackoverflow, kterou se mi teď nedaří dohledat. Tam autor příspěvku psal o rozdílu mezi JavaScriptem a jinými jazyky.

Chamurappi:
inak jsem už vyráběl desítky kalkulaček (mzdových...“
Právě jsem dělal něco podobného :-) a přepisoval vzorečky z Excelu do JavaScriptu a pak se divil, že mi to nepočítá přesně.

Problém je třeba tady:

V JavaScriptu je 24000 * 0.07 je rovno 1680.0000000000002, ale v PHP to je ale 1680. Takže při každém počítání, kde se používá desetinné číslo bych měl použít Math.round?
1Pupik1989
Profil
Zrovna jsem chtěl napsat, že integer, float a double jdou reprezentovat v binární soustavě. S tím jsem si v poslední době užil já při parsování png a hlavně 3ds.

Pro inspiraci http://en.m.wikipedia.org/wiki/Single-precision_floating-point_format na wiki je pak popsán i double.
Chamurappi
Profil
Reaguji na joa:
Nezabíhej zbytečně do desetinných čísel. Nenásob 0.07, násob 7 a pak děl 100.


Reaguji na 1Pupika1989:
Pro upřesnění: v JS jsou úplně všechno doubly.
1Pupik1989
Profil
[#10] Chamurappi: Já vím že javascript čísla reprezentuje jako 64-bitová. Šlo spíše o to, že když se číslo rozseká do pole, tak může být třeba 128bitové, pokud je zapsáno jako string.
joe
Profil
Chamurappi:
Máš pravdu, v tomto případě to jde, ale co když právě to číslo 0.07 by zadával někde uživatel na stránce? Mam postupovat stejně, že ho napřed vynásobím (třeba 100) a pak výsledek vydělím 100? (takže zjišťovat, kolik desetinných míst má?)
Joker
Profil
joe:
Přiznám se, že tomu moc nerozumím
Je to úplně jednoduché.
Určitě bych dokázal na kus papíru o velikosti platební karty napsat jakékoliv celé číslo od 0 do miliardy. Případně i z daleko většího intervalu.
Jak velký kus papíru bych potřeboval, abych dokázal zapsat libovolné reálné číslo z intervalu <0;1>? Nebo i menšího? Z jakéhokoliv intervalu obsahujícího víc než jednu hodnotu?
Pro jakýkoliv použitelný interval reálných čísel by schopnost uložit libovolnou hodnotu z něj vyžadovala nekonečné množství paměti.
Takže už z principu nemůže počítač uložit jakékoliv reálné číslo přesně, ani jakékoliv reálné číslo z určitého intervalu.

Takže při každém počítání, kde se používá desetinné číslo bych měl použít Math.round?
Ne, jenom při zobrazování výsledku uživateli.

Máš pravdu, v tomto případě to jde, ale co když právě to číslo 0.07 by zadával někde uživatel na stránce?
Chamurappi psal zbytečně, zas to není tak, že by se ve skriptu vůbec nesměla objevit operace s desetinným číslem.

Mimochodem, kdysi dávno jsem si jen tak pro zábavu napsal funkce, které uměly dělat výpočty s čísly uloženými jako řetězce :-)
Takže to pak umělo počítat přesně a prakticky nehrozilo přetečení, jen efektivita byla tristní :-)
_es
Profil
Joker:
Mimochodem, kdysi dávno jsem si jen tak pro zábavu napsal funkce, které uměly dělat výpočty s čísly uloženými jako řetězce :-)
Takže to pak umělo počítat přesně a prakticky nehrozilo přetečení, jen efektivita byla tristní :-)
Ako „presne“ ti to vyrátalo trebárs reťazec "10" delený reťazcom "3"?
1Pupik1989
Profil
[#14] _es: Pokud tomu dovolíš, tak to bude na třeba 600 desetinných míst. :)

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: