English
Instant Developer Foundation Documentazione
  • Note di rilascio
  • Instant Developer Foundation
  • Versioni precedenti
  • Versione 8.0.3560
  • Correzioni

JAVA: Valori CURRENCY e arrotondamento

copia link

Descrizione del difetto

Utilizzando la funzione ROUND in applicazioni Java nel caso di valori di tipo CURRENCY si potevano ottenere risultati non corretti in alcuni casi particolari, come, per esempio:

   Currency c = 2.235;
   Round(c, 2) -> 2.23
La causa del malfunzionamento non è dovuta alla funzione ROUND bensì alla definizione c = 2.235.

Le applicazioni prodotte con Instant Developer non utilizzano direttamente i tipi nativi ma utilizzano la classe IDVariant come wrapper per i tipi nativi. Tale classe contiene, al suo interno, il valore dell'oggetto. Quando viene scritta in Visual Code la seguente l'assegnazione
   Currency c = 2.235
Instant Developer produce il seguente codice:
   IDVariant c = new IDVariant(2.235, IDVariant.DECIMAL)
Tale chiamata indica al sistema che occorre costruire una istanza della classe IDVariant utilizzando il valore (float) fornito e che il tipo risultante deve essere di tipo DECIMAL. Internamente alla classe IDVariant, nel caso indicato sopra, viene utilizzata la seguente riga di codice Java:
   Value = new BigDecimal(2.235)
dove Value è la proprietà della classe IDVariant ove viene conservato il valore. Purtroppo il costruttore BigDecimal(double) di Java ha alcuni problemi, come indicato anche nella documentazione della JDK della funzione BigDecimal. In questo caso, infatti, la proprietà Value viene inizializzata al valore 2.234999999999999875655021241982467472553253173828125 ed ecco il motivo per cui il risultato della funzione Round(c, 2) fornisce il valore 2.23.

Paradossalmente Sun sconsiglia di utilizzare il costruttore BigDecimal(double) e consiglia di utilizzare il costruttore BigDecimal(String) perché più preciso.

A partire dalla versione 8.0.3560 IN.DE definisce le variabili CURRENCY utilizzando il seguente codice Java:
   Value = new BigDecimal(Value.toString())

Effetti del malfunzionamento

  • Le variabili di tipo CURRENCY vengono create ma la loro precisione non è corretta a causa di errori macchina insiti nel costruttore della classe Java BigDecimal.

Soluzioni

Utilizzare la versione 8.0.3560.

Funzionalità interessate

L'uso delle variabili di tipo CURRENCY in applicazioni Java.

Note

  • Questo difetto è stato corretto anche nella versione 7.5.3400 r16.

Ultima modifica: 23/03/2021 / Validità: da 8.0.3560

Hai trovato utile l'articolo?

Grazie per il feedback!

Ti serve altro aiuto?

Consulta il Forum