Ho la necessità di effettuare degli arrotondamenti su degli importi, mediante javascript perchè deve andare ad aggiornare i dati di un form in base a come variano gli altri senza ricaricare la pagina.
Ho trovato girovagando per il web qualcosa che sembrava fare al caso mio, ovvero il codice che riporto sotto; il problema è che in alcune situazioni sbaglia gli arrotondamenti; ad esempio, se faccio:
3*9.17 ottengo 27.51 come netto ma 33.90 come valore lordo (dovrebbe essere 33.01, iva al 20%)
Lordo e netto son ottenuti secondo questo calcolo:
var lordo = parseMoney((quantita*prezzo*aliqiva) - (((quantita*prezzo)/100)*sconto*aliqiva),'.');
var netto = parseMoney((quantita*prezzo) - (((quantita*prezzo)/100)*sconto),'.');
Spero qualcuno mi sappia dare delle dritte, sia che riguardino il problema su questo codice sia eventuali sistemi alternativi
codice:function parseDec(val,places,sep) { // This function takes two arguments: // (string || number) val // (integer) places // (string) sep // val is the numeric string or number to parse // places represents the number of decimal // places to return at the end of the parse. // sep is an optional string to be used to separate // the whole units from the decimal units (default: '.') val = '' + val; // Implicitly cast val to (string) if (!sep) { sep = '.'; // If separator isn't specified, then use a decimal point '.' } if (!places) { places = 0; } places = parseInt(places); // Make sure places is an integer if (!parseInt(val)) { // If val is null, zero, NaN, or not specified, then // assume val to be zero. Add 'places' number of zeros after // the separator 'sep', and then return the value. We're done here. val = '0'; if (places > 0) { val += sep; while (val.substring((val.indexOf(sep))).length <= places) { val += '0'; } } return val; } if ((val.indexOf('.') > -1) && (sep != '.')) { val = val.substring(0,val.indexOf('.')) + sep + val.substring(val.indexOf('.')+1); // If we're using a separator other than '.' then convert now. } if (val.indexOf(sep) > -1) { // If our val has a separator, then cut our value // into pre and post 'decimal' based upon the separator. pre = val.substring(0,val.indexOf(sep)); post = val.substring(val.indexOf(sep)+1); } else { // Otherwise pre gets everything and post gets nothing. pre = val; post = ''; } if (places > 0) { // If we're dealing with a decimal then... post = post.substring(0,(places+1)); // We care most about the digit after 'places' if (post.length > places) { // If we have trailing decimal places then... //alert (parseInt(post.substring(post.length - 1))); if ( parseInt(post.substring(post.length - 1)) > 4 ) { post = '' + Math.round(parseInt(post) / 10); //post = '' + post.substring(0,post.length - 2) + (1/Math.pow(10,places)); //post = ('' + post.substring(0,post.length - 2)) + (parseInt(post.substring(post.length - 1)) + 1); } else { post = '' + Math.round(parseInt(post)); } } if (post.length > places) { post = '' + Math.round(parseInt(post.substring(0,places))); } else if (post.length < places) { while (post.length < places) { post += '0'; } } } else { if (parseInt((post.substring(0,1))) > 4) { pre = '' + (parseInt(pre) + 1); } else { pre = '' + (parseInt(pre)); } post = ''; } sep = (post.length > 0) ? sep : ''; // Should we use a separator? val = pre + sep + post; // Rebuild val return val; } function parseMoney(val,sep) { // Specialized version of parseDec useful for // parsing money-related data. Arguments: // (string || number) val // (string) sep // val is the monetary value to be parsed, // sep is an optional decimal separator (default: '.') return parseDec(val,2,sep); } function sepToDec(val,sep) { val = '' + val; if ((val.indexOf(sep) > -1) && (sep != '.')) { val = val.substring(0,val.indexOf(sep)) + '.' + val.substring(val.indexOf(sep)+1); } return val; } function decToSep(val,sep) { val = '' + val; sep = '' + sep; if ((val.indexOf('.') > -1) && (sep.length > 0)) { val = val.substring(0,val.indexOf('.')) + sep + val.substring(val.indexOf('.')+1); } return val; }


Rispondi quotando
