Newsgroup: it.comp.lang.javascript
Titolo: Problema con i numeri - sto rincretinendo

Non riesco a capire dove sia l'errore
Ho adattato un carrello della spesa alle mie esigenze e finchè i prezzi
erano in lire tutto funzionava alla perfezione.
Ora i prezzi sono in euro ed ogni tanto nel fare semplici calcoli (Totale,
Iva, Totale + Iva  che prima funzionavano perfettamente) ho risultati a 13
decimali ed oltretutto in difetto
Es invece di 2244.53
ho 2244.5299999999997
I prezzi unitari vengono passati in maniera corretta.
La cosa strana è che a volte (?) i calcoli sono perfetti
Ho provato sia su Ie6 che su Ie5.5
Qulacuno mi sa dire perchè?
Ringrazio anticipatamente.
Roberto
Questo è un esempio di quello che fa
Cod        Descrizione
Q.tà    Cad.             Totale
700001 EPSON PHOTOPC 3000Z RIS.2544*1904 16 MB             1         581.53
581.53     Rimuovi
109522 TECNOWARE POWER ADVANCED 600VAi/300VA     20         83.15
1663      Rimuovi
SubTotale 2244.5299999999997
+ Iva 20% 448.9059999999999
TOTALE 2693.4359999999997
Controvalore £. 5215219.32
===========
Questo è il codice (nota: la variabile euro corrisponde a £. - ho cambiato
l'operazione ma ho mantenuto gli stessi nomi di variabile di quando il
carrello era in £irette)
<SCRIPT LANGUAGE="JavaScript">
 // showItems() - displays shopping basket in a table
 function showItems() {
  index = document.cookie.indexOf("TheBasket");
  countbegin = (document.cookie.indexOf("=", index) + 1);
         countend = document.cookie.indexOf(";", index);
         if (countend == -1) {
              countend = document.cookie.length;
         }
  fulllist = document.cookie.substring(countbegin, countend);
  totprice = 0;
  iva= 0;
  totivato = 0;
  euro=0;
  document.writeln('<TABLE BORDER>');
document.writeln('<TR><TD><b>Cod</b></TD><TD><b>Descrizione</b></TD><TD><b>Q
uantità</b></TD><TD><b>Cad. ?</b></TD><td><b>Costo
Totale</b><TD><b>Azione</b></TD></TR>');
  itemlist = 0;
  for (var i = 0; i <= fulllist.length; i++) {
   if (fulllist.substring(i,i+1) == '[') {
    itemstart = i+1;
                         thisitem = 1;
   } else if (fulllist.substring(i,i+1) == ']') {
    itemend = i;
    thequantity = fulllist.substring(itemstart, itemend);
    itemtotal = 0;
    itemtotal = (eval(theprice*thequantity));
    temptotal = itemtotal * 100;
    totprice = totprice + itemtotal;
    iva = totprice*20/100;
// rc = alert(iva);
    totivato = (eval(totprice+totprice*20/100));
    valeuro=1936.27;
    euro = totivato*valeuro;
    euro=parseInt(euro*100)/100;
    itemlist=itemlist+1;
document.writeln('<tr><td>'+theNum+'</td><td>'+theitem+'</td><td
align=center>'+thequantity+'</td><td align=right>'+theprice+'</td><td
align=right>'+itemtotal+'</td><td><a
href="javascript:removeItem('+itemlist+')">Rimuovi</a></td></tr>');
   } else if (fulllist.substring(i,i+1) == '|') {
         if (thisitem==1) theitem = fulllist.substring(itemstart, i);
         if (thisitem==2) theprice = fulllist.substring(itemstart, i);
         if (thisitem==3) theNum = fulllist.substring(itemstart, i);
         thisitem++;
             itemstart=i+1;
    }
  }
  document.writeln('<tr><td align=right colspan=4><b>SubTotale</b></td><td
align=right>'+totprice+'</td><td></td></tr>');
document.writeln('<tr><td align=right colspan=4><b>+ Iva 20%</b></td><td
align=right>'+iva+'</td><td></td></tr>');
document.writeln('<tr><td align=right colspan=4><b>TOTALE</b></td><td
align=right><b>'+totivato+'</b></td><td></td></tr>');
document.writeln('<tr><td align=right colspan=4>Controvalore    <b>
£.</b></td><td align=right>'+euro+'</td><td></td></tr>');
  document.writeln('</TABLE>');
 }
 function removeItem(itemno) {
  newItemList = null;
  itemlist = 0;
  for (var i = 0; i <= fulllist.length; i++) {
   if (fulllist.substring(i,i+1) == '[') {
    itemstart = i+1;
   } else if (fulllist.substring(i,i+1) == ']') {
    itemend = i;
    theitem = fulllist.substring(itemstart, itemend);
    itemlist=itemlist+1;
   if (itemlist != itemno) {
     newItemList = newItemList+'['+fulllist.substring(itemstart,
itemend)+']';
    }
   }
  }
  index = document.cookie.indexOf("TheBasket");
  document.cookie="TheBasket="+newItemList;
  top.frames[3].location = "_k.htm";
 }
 // clearBasket() - removes all items from the basket
 function clearBasket() {
  if (confirm('Sei sicuro di voler svuotare il carrello?')) {
   index = document.cookie.indexOf("TheBasket");
   document.cookie="TheBasket=.";
   top.frames[3].location = "_k.htm";
  }
 }
</SCRIPT>

E' un problema che esiste dai tempi dell'8088 (non ricordo il perché, é
comunque legato ai calcoli in virgola mobile)
Quando scrivi il risultato fai un Math.Round alle cifre decimali che ti
interessano

 ha scritto:

All'epoca c'era un trucco "sporco" utilizzato dai piu' smaliziati in
tutti i calcoli per prevenire la possibilita' di risultati decimali
scorretti: aggiungere ad ogni somma un valore decimale molto basso e
poi prendere l'intero del risultato. 
Percio':
A = 2
B = 3
X = 0.0001
Risultato = intero (A + B + X).
Ciao.
Vincenzo

 ha scritto nel messaggio
news:9sefk1$ebs$3...@fe1.cs.interbusiness.it...


Ho trovato la soluzione
Questa funzione arrotonda ai decimali che si desiderano.
Magari sarà utile a qualcun altro
Grazie degli aiuti
Roberto
=============
<script>
function roundOff(value, precision)
{
        value = "" + value //convert value to string
        precision = parseInt(precision);
        var whole = "" + Math.round(value * Math.pow(10, precision));
        var decPoint = whole.length - precision;
        if(decPoint != 0)
        {
                result = whole.substring(0, decPoint);
                result += ".";
                result += whole.substring(decPoint, whole.length);
        }
        else
        {
                result = whole;
        }
        return result;
}
</script>

Se lo vuoi a 2 decimali: Math.Round(cifra*100)/100