Newsgroup: it.comp.lang.javascript
Titolo: Problema con la sottrazione!

Devo fare la differenza tra i valori inseriti in 2 text, ma ho il
problema che come risultato ottengo una sfilza di decimali: ad es.
852.06 - 25.82 = 826.2399999999999
Ho letto alcuni vecchi post a riguardo e alcuni dicevano che è tipo un
bug di javascript.
Come faccio ad ovviare a questo problema? Possibile che per fare una
semplice operazione matematica ci debbano essere tutti questi
inconvenienti?
Thanks

 inconvenienti?
Math.round(tuorisultato,numerodecimali);
-- 
"That until there is no longer first class
And second class citizens of any nation
Until the colour of a man's skin
Is of no more significance than the colour of his eyes
Me say war"
B.M.

 Thanks
Prego

 n = Math.round( n * 100 ) / 100;
Grazie per l'aiuto, credo proprio che farò in questo modo, visto che
non si riesce direttamente ad effettuare una semplice operazione
matematica!
Thanks

 matematica!
direttamente in che senso?
Math.round(852.06 - 25.82,100);  ?
-- 
"Ho smesso di fumare.
 Vivrò una settimana di più.
 E in quella settimana pioverà a dirotto"
									    W.A.

 Math.round(852.06 - 25.82,100);  ?
Guarda che devi aver sovrascritto il metodo round nelle tue librerie,
perche' originalmente non prevede un secondo argomento:
http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:Math:round

 
http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:Math:round
:-) ma in c# sì ... :-/
Math.round((852.06 - 25.82)*100)/100;
-- 
"Non sai che ci vuol scienza
 ci vuol costanza
 ad invecchiare senza maturità"
									    F.G.

 Math.round((852.06 - 25.82)*100)/100;
Oppure in alternativa che toFixed metodo dell'ogetto Number, che per i
browser che non lo supportano tu e Zer0 avete preparato un bel prototype:
http://www.criosoftware.it/default40.aspx

 
http://www.criosoftware.it/default40.aspx
La versione corretta dovresti trovarla qui:
http://groups.google.it/group/it.comp.lang.javascript/msg/267bdd3d7b57d872
Gliel'ho detto più volte a Cristiano di aggiornarla, ma ha spesso ha troppe
cose da fare a lavoro, e gli passa di mente (immagino poi in questo periodo,
con molti server che hanno fatto le scintille).
Tra l'altro sarebbe un prototype, quello, da usare anche nei browser che lo
supportano nativamente; per i motivi esposti in quello stesso post.
-- 
~ Ci si aspetta di tutto, ma non si e' mai preparati a nulla.
(M.Swetchine)

 con molti server che hanno fatto le scintille).
eggià ... ma ho dato un occhio al volo ai 2 link e non trovo differenze tra
le 2 function, cosa devo aggiornare?
-- 
"Emancipate yourselves from mental slavery;
None but ourselves can free our minds"
									    B.M.

 le 2 function, cosa devo aggiornare?
Devi aggiungere un segno di uguaglianza:
http://groups.google.it/group/it.comp.lang.javascript/msg/ece5c818eb9c4c6e
-- 
~ Non prendere la vita troppo sul serio: Non ne uscirai vivo in ogni caso.

 supportano nativamente; per i motivi esposti in quello stesso post.
Ok, bene.
Guarda caso proprio oggi avevo in programma di risolvere un mio baco che ho
scoperso appogiarsi ad uno tuo...
Ho riscontrato il seguente problema:
i numeri compresi tra 0.95 e 0.99 e fixati a 1 danno 0.0
0.96.toFixed( 1 ) = 0.0
Hai tempo di darci un'occhiata?

> Hai tempo di darci un'occhiata?
Il problema e' chiaro:
return (this<0?"-":"") + ( ( m ) ? ( "0" + num.substr( 1 ) ) : num );
                                    ^^^^^
non e' previsto che potrebbe essere anche "1"


la mia proposta di modifica e' qui:
var num = Math.abs( this ), m = ( num >= 0 && num < 1 ) ? 1 : 0;
                                                 ^^^^^^^
sostituire 1 con 0.95:
Number.prototype.toFixed = function( n )
{
   if( n > 0 )
   {
      var num = Math.abs( this ), m = ( num >= 0 && num < 0.95 ) ? 1 : 0;
      num += m;
      num = new String( Math.round( num * new Number( "1e+" + n ) )
).replace( new RegExp( "(\\d+)(\\d{"+n+"})$" ), "$1.$2" );
      return ( this < 0 ? "-" : "" ) + ( ( m ) ? ( "0" + num.substr( 1 ) )
: num );
   }
   else
   {
      return new String( Math.round( this ) );
   }
}
Puo' funzionare?

 Hai tempo di darci un'occhiata?
Non credo nel breve termine, queste due settimane sono un po' preso. Se già
oggi avevi previsto di lavorare su questa cosa prova dargli un'occhiata tu;
tanto la funzione è abbastanza semplice.
In caso contrario vedrò di ritagliarmi del tempo appena possibile.
Ed è già il secondo baco che si trova, ma la cosa non mi stupisce; del resto
la genesi che ebbe quella funzione è abbastanza nota. E neppure allora mi
convinceva del tutto il codice:
http://groups.google.it/group/it.comp.lang.javascript/msg/1a4655cce09b7552
-- 
~ Ci sono tre modi di fare le cose.
Giuste, sbagliate e come dico io. (Robert De Niro in "Casinò")

 
http://groups.google.it/group/it.comp.lang.javascript/msg/1a4655cce09b7552
<<OT>>
come fai a prendere il link del messaggio da google groups?

 Devi aggiungere un segno di uguaglianza:
fatto (scaduti quindi i 2-3 minuti al mese dedicabili a criosoftware :-/ )
-- 
"Run rabbit run
 dig that hole, forget the sun
 and when at last the work is done
 don't sit down, it's time to dig another one"
									    P.F.

 fatto (scaduti quindi i 2-3 minuti al mese dedicabili a criosoftware :-/ )
Accidenti, potevi aspettare un attimo, ci sara' da fare un'altra modifica.
Zer0 prossimamente dovrebbe rilasciarne una nuova versione...
Vabbe', sara' per il mese prossimo ;)

       var num = Math.abs( this ), m = ( num >= 0 && num < 0.95 ) ? 1 : 0;
Inoltre, data la natura della funzione e della gestione dei float,
preferisco evitare di utilizzare numeri con la virgola qui dentro. E' uno
dei motivi per cui la sviluppai esattamente in quel modo, a stringhe.
Opterei quindi per sostituire:
	return (this<0?"-":"")+(m?"0"+num.substr(1):num);
con:
	return (this<0?"-":"")+(RegExp.$1-m)+num.substr(1);
Ho fatto tutto un po' di corsa, non so se va effettivamente bene. Se puoi,
fai qualche test, già che ci sei, altrimenti ci penserò quando potrò.
-- 
~ "Lo dice il buon senso, ma il buon senso non è uno standard".
(Jeffrey Zeldman)

 fai qualche test, già che ci sei, altrimenti ci penserò quando potrò.
Ok

 e quindi nel caso sarebbe forse anche da rivedere il replace
In che senso?
-- 
~ It may be that the old astrologers had the truth exactly reversed,
when they believed that the stars controlled the destinies of men.
The time may come when men control the destinies of stars.
(Arthur C. Clarke)

 In che senso?
nel senso che anche li' c'e' l'utilizzo dei 'Parenthesized substring
matches' "$1.$2"...

 matches' "$1.$2"...
Temo che tu non abbia letto con attenzione e abbia frainteso. Sono solo le
*proprietà* dell' *oggetto* a essere deprecated, non la sintassi delle
regexp.
Quello che hai letto, è solo la "descrizione". Riguarda la tabella e ti sarà
chiaro.


 chiaro.
Capito :P

 TP/BP/Delphi/jscr/&c, FAQ items, links.