2012-08-29 11 views
5

Se si tenta il seguente bit si otterrà -0JSTL zero negativo

<c:set var="demo" value="-0.04" /> 
<fmt:formatNumber maxFractionDigits="1" value="${demo}" var="demo" /> 

ma se si prova se minore di 0 si dice vero

<c:if test="${demo < 0.00}">...</c:if> 

Come posso andare intorno a questo? Non sembra avere senso, 0 equivale a -0, ho avuto la dimostrazione in algebra ... Nel this post indicano un riferimento IEEE, ma ancora, non riesco a risolvere il problema

EDIT: Grazie per il commento, c'è un errore nel codice di esempio. Assegno il valore arrotondato alla variabile demo. E l'uscita non è 0, ma -0, ho provato colpo

+0

Qual è il problema? Hai assegnato a una variabile un valore di -0,04 e quindi l'hai stampata, arrotondata a una posizione decimale (che emetterà 0.0). Quindi si verifica se il valore originale, -0,04 è inferiore a 0,00 ... che restituisce true. – patros

+1

C'è stato un errore nel codice, risolto. E NON emette 0, uscite -0 – Hartimer

+1

Dib per 'Zero negativo' come nome di banda! –

risposta

0

lungo qui, ma è perché è l'analisi l'originale -0.04 come una stringa?

Forse provare questo, che credo lo spingono a valutare come un numero:

<c:set var="demo" value="${-0.04}" /> 
+1

grazie per la risposta. non fa differenza, produce ancora -0 – Hartimer

0

OK, questa volta credo di poter spiegare: si tratta di un bug (o caratteristica) di java.text.DecimalFormat, che è cosa utilizza <fmt:formatNumber /> sotto il cofano.

Ecco una Copy'n'Paste di una sessione rapida Beanshell ho cercato come un esperimento:

BeanShell 2.0b4 - by Pat Niemeyer ([email protected]) 
bsh % import java.text.*; 
bsh % fmt = new DecimalFormat(); 
bsh % fmt.setMaximumFractionDigits(1); 
bsh % print(fmt.format(-0.04d)); 
-0 
bsh % 
0

Si potrebbe scrivere il proprio tag numero di formattazione che compensa questo.

// Read these values from tag attributes 
String pattern = "0"; 
Double myNumber = -0.04d; 

// Create a decimal format with correct rounding 
DecimalFormat df = new DecimalFormat(pattern); 
df.setRoundingMode(RoundingMode.HALF_UP); 

// Format in two steps to compensate for '-0' 
String temp = df.format(myNumber + 1); 
String formatted = df.format(Double.valueOf(temp) - 1);