2012-08-29 21 views
5

Wenn Sie das folgende Bit versuchen werden Sie bekommen -0jstl negative Null

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

aber wenn Sie testen, ob weniger als 0 es wahr, sagt

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

Wie kann ich um dieses gehen? Es scheint nicht Sinn zu machen, 0 ist gleich -0, ich hatte es in der Algebra beweisen ... In this post zeigen sie auf eine IEEE-Referenz, aber ich kann das Problem nicht lösen

EDIT: Danke Für den Kommentar gibt es da einen Fehler im Codebeispiel. Ich weise der Demo-Variable den gerundeten Wert zu. Und die Ausgabe ist nicht 0, aber -0, habe ich es versucht

+0

Was ist das Problem? Sie haben einer Variablen einen Wert von -0,04 zugewiesen, und dann geben Sie sie auf eine Dezimalstelle gerundet aus (die 0.0 ausgibt). Dann testen Sie, ob der ursprüngliche Wert, -0.04, kleiner als 0,00 ... ist, was wahr ergibt. – patros

+1

Es gab einen Fehler im Code, behoben. Und es gibt keine 0, Ausgänge -0 – Hartimer

+1

Dibs für 'Negative Zero' als Bandname aus! –

Antwort

0

Long Shot hier, aber ist es, weil es das Original -0.04 als String analysiert?

Vielleicht versuchen diese, die ich denke, wird es als Nummer auszuwerten erzwingen:

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

danke für die Antwort. es macht keinen Unterschied, es produziert immer noch -0 – Hartimer

0

OK, dieses Mal, wenn ich glaube, ich kann es erklären: es ein Fehler ist (oder Funktion) von java.text.DecimalFormat, das ist was <fmt:formatNumber /> unter der Motorhaube verwendet. Hier

ist ein copy'n'paste einer schnellen Sitzung Beanshell ich als ein Experiment versucht:

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

Sie könnten Ihren eigenen Zahlenformatierung Tag schreiben, die diese kompensiert.

// 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);