Newsgroup: it.comp.java
Titolo: E? un BUGGONE del JDK o c'e' un modo + intell

Salve
  public static void main(String args[])
  {
    double importo = 0;
    double iva = 0;
    double imponibile = 0;
    double imposta = 0;
    double app = 0;
    iva = 20;
    importo = 15.58;
    importo = importo * 100;
    System.out.println(importo);
    importo = importo * 100;
    System.out.println(importo);
    iva = iva + 100;
    System.out.println(iva);
    app = importo/iva;
    System.out.println(app);
    app = Math.round(app);
    System.out.println(app);
    imponibile =  app/100;
    System.out.println(imponibile);
    importo = importo / (100*100);
    imposta = importo - imponibile;
    System.out.println("importo: " + importo + " = " + imponibile + " + " +
imposta );
  }
ho oportunamente trasformato in passaggi successivi questa funzione per lo
scorporo dell'iva
ho provato in vari modi ma con questi dati mi si verifica un errore
madornale nel risultato ... guardate cosa esce fuori
qualcuno ha un idea o sa darmi una spiegazione ...
1558.0
155800.0
120.0
1298.3333333333333
1298.0
12.98
importo: 15.58 = 12.98 + 2.5999999999999996
grazie
luc...@supereva.it

 Salve
Leggiti i post precedenti, prima di essere linciato... ;)
uL


ROTFL!
--
I'm thinking about a cool signature:)
Coming soon...

 wrote in message
news:a5jqis$1rk$1...@pegasus.tiscalinet.it...


telespalla?
glielo dici te?
;)

1. Le costanti per essere double devono essere seguire da .0, altrimenti sono intere:
2 -> costante intera
2.0 -> costante double
2. Java non effettua alcuna approssimazione in fase di stampa, e' necessario usare
l'oggetto java.text.DecimalFormat
3. I valori in virgola mobile in Java (come anche in C e in altri linguaggi) sono in
alcuni casi intrinsecamente imprecisi: usa al loro posto BigDecimal
Ciao,
    Bruno.
---
| Bruno Bossola
| A Java Software Engineer :-)
| 
http://digilander.iol.it/bbossola

[...]
Ok, tocca aggiungere la questione dei double alla FAQ. :)
-- 
Life's something u don't get out alive..
ObjectZone - 
http://space.tin.it/computer/csadun

Non per entrare nel dettaglio ma:
totale=imponibile * 1.aliquota
Ovvero:
15.58=imponibile * 1.20
Da cui: imponibile = 15.58/1.20 ovvero imponibile=totale/1.aliquota
Ovviamente: totale=imponibile*1.aliquota ad esempio:
12.98*1.2=15.576 (arrotondando a 15.58)
Se invece si desidera solo sapere a quanto ammonta il 20% di un importo,
totate*0.aliquota
12.98*0.2=2.596
A volte mi domando perchè la gente si complica così tanto la vita a
moltiplicare per 100, dividere, sommare...
Oltre tutto si richia pure di andare a perdere delle rilevanze, perchè con
l'aumentare del numero di operazioni si aumenta, entropicamente parlando, la
possibilità di disattenzioni/errori e arrotondamenti.
J
PS: a titolo puramente stupidistico:
100 : imponibile=aliquota : importo dell'iva
importo dell'iva=imponibile*aliquota/100
aggiungendo parentesi inutili solo per comprensione
importo dell'iva=imponibile* (aliquota/100)
esempio: aliquota= 20% allora 20/100 darà 0.2
A questo punto, se si vuole il totale dell'imponibile + l'importo dell'iva:
[totale=imponibile+importo dell'iva
[importo dell'iva=aliquota*imponibile/100
mettendo insieme:
totale=imponibile+aliquota*imponibile/100
raccogliendo l'imponibile:
totale=imponibile*(1+aliquota/100)
da cui
totale=imponibile*1.aliquota
esempio
totale=12.98*(1+20/100)
come dire
totale=12.98*(1+.20)
ovvero
totale= 12.98*1.20
PPS: Ovviamente l'aliquota deve essere espressa in percentuale.

 ;)
scusate ... ma mi potreste rispondere senza tanti discorsi ... ? ...
il codice e' scritto cosi' ... perche' l'ho scomposto. ... per
praticita' di debug...
poi volevo sottolineare che anche in Javascript da lo stesso problema
mentre
con vbscript no .... (stesso codice ... ) allora ...

 ;)
quello che volevo ottenere era un banale scorporo dell'iva dato un
importo arrotondato al 100 simo...
ho fatto tutti i casting del caso ... ma il problema sta nella
sottrazione
e non per tutti i valori ... ? ...

Eccomi Red Wizzard.............
Allora, non è un BUG (vediamo se mi è entrato in testa tutto il
ragionamento).
Purtroppo la matematica in virgola mobile sui calcolatori, deve fare i conti
con la loro realtà costruttiva, quindi ci sono spiegazioni ben precise per
quei risultati all'apparenza strani.
Ti conviene leggere sui gruppi di google i vecchi post, dove ci sono state
persone che hanno spiegato benissimo i calcoli che sono necessari per poter
gestire su macchine binarie numeri in virgola mobile.
Cmq, sappi che è tutto perfettamente risolvibile utilizzando la classe
BigDecimal.
Ricordati soltatnto che suddetta classe dopo le varie operazioni
(moltiplicazione, addizzione, etc.) restituisce un oggetto di tipo
BigDecimal che contiene il risultato.
Quindi se devi addizionare ad un BigDecimal un'altro BigDecimal :
BigDecimal a = new BigDecimal("12345.2345");
BigDecimal b = new BigDecimal("145.23");
a = a.add(b);
Avrai notato che ho passato il numero double alla classe BigDecimal sotto
forma di stringa, perché se lo passi come double scattano le stesse
motivazioni di sopra.

Non si finisce mai di imparare.
Grazie

Salve a tutti, sto cercando di manipolare immagini da un servlet. Ho un 
servlet che permette l'upload di immagini e vorrei creare 
automaticamente il thumbnail di ogni nuova immagine.
Ovviamente in un servlet non posso usare i soliti metodi che si usano in 
un applet.
Ho provato a cercare degli esmpi in rete ma non ho trovato nulla.
Grazie e tutti
Francesco



import java.awt.Image;
import java.awt.Graphics2D;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.OutputStream;
import java.io.FileOutputStream;
import javax.swing.ImageIcon;
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;
class Thumbnail {
    public static void main(String[] args) {
        createThumbnail(args[0], args[
          1], Integer.parseInt(args[2]));
    }
    /**
     * Reads an image in a file and creates
     * a thumbnail in another file.
     * @param orig The name of image file.
     * @param thumb The name of thumbnail file. 
     * Will be created if necessary.
     * @param maxDim The width and height of
     * the thumbnail must
     * be maxDim pixels or less.
     */
    public static void createThumbnail(
     String orig, String thumb, int maxDim) {
        try {
            // Get the image from a file.
            Image inImage = new ImageIcon(
                          orig).getImage();
            // Determine the scale.
    double scale = (double)maxDim/(
       double)inImage.getHeight(null);
            if (inImage.getWidth(
             null) > inImage.getHeight(null)) {
                scale = (double)maxDim/(
                double)inImage.getWidth(null);
            }
            // Determine size of new image.
            //One of them
            // should equal maxDim.
            int scaledW = (int)(
             scale*inImage.getWidth(null));
            int scaledH = (int)(
             scale*inImage.getHeight(null));
            // Create an image buffer in
            //which to paint on.
            BufferedImage outImage =
              new BufferedImage(scaledW, scaledH,
                BufferedImage.TYPE_INT_RGB);
            // Set the scale.
            AffineTransform tx =
              new AffineTransform();
            // If the image is smaller than
            //the desired image size,
            // don't bother scaling.
            if (scale < 1.0d) {
                tx.scale(scale, scale);
            }
            // Paint image.
            Graphics2D g2d =
             outImage.createGraphics();
            g2d.drawImage(inImage, tx, null);
            g2d.dispose();
            // JPEG-encode the image
            //and write to file.
            OutputStream os =
             new FileOutputStream(thumb);
            JPEGImageEncoder encoder =
              JPEGCodec.createJPEGEncoder(os);
            encoder.encode(outImage);
            os.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        System.exit(0);
    }
}
 
---------

  
Grazie mille, ora studio un po' il codice che mi hai mandato.
Forse non sei una mela marcia dopotutto :-))
Francesco

Non si finisce mai di imparare.
io aspetteri la prossima finanziaria prima di imparare..:)

  
Ho usato il tuo codice nel servlet e funziona, però incontro una serie 
di problemi. Io uso come motore di servlet Tomcat su piattaforma Unix e 
funzina senza Xserver startato. Quindi quando cerco di eseguire il 
servlet mi da un errore. Ho provato ad utilizzare Xvfb (un X server 
fittizio), in questo modo il servlet funziona, ma dopo aver resizato 
l'immagine tomcat va in crash, ora stò cercando di comprenderne il motivo.
Grazie di nuovo
Francesco

 
Problema risolto provando diversi settaggi di Xvfb.
Ciao