2015-01-08 10 views
5

Hier Aufrechterhaltung ist meine Funktion eine Zahl bis zu zwei Dezimalstellen Abrundungs ​​aber wenn die abgerundete Zahl 1,50 ist, scheint es die Hinter Null zu ignorieren und gibt nur 1,5Abrunden Doppel während der hinteren Null

public static double roundOff(double number) { 
     double accuracy = 20; 
     number = number * accuracy; 
     number = Math.ceil(number); 
     number = number/accuracy; 
     return number; 
    } 

So Wenn ich 1,499 sende gibt es 1,5 wo ich will 1,50

+2

Es gibt kein separates 'double' für 1,5 und für 1,50. Sie sind zahlenmäßig gleich, es gibt also nur eine "doppelte" Darstellung von beiden. –

+0

Vielleicht sollte Ihre Methode 'String' zurückgeben, anstatt' double', so dass Sie damit beliebige Formatierungen machen können. –

+0

Bist du dir sicher "20"? Vielleicht habe ich missverstanden, was Sie zu tun versuchen, aber Ihre Methode für '1.489' würde' 1.49' nicht zurückgeben. Ich würde denken, dass Sie die Genauigkeit für zwei Dezimalstellen auf "100" setzen möchten. – cyon

Antwort

10

Dies ist ein Druck poblem zu verstehen:

double d = 1.5; 
System.out.println(String.format("%.2f", d)); // 1.50 
+0

Bekam es. Vielen Dank. Das hat geholfen. –

2

Sie müssen es als String formatieren, um dies zu tun. Java wird, wie die meisten Sprachen, die nachgestellte Null löschen.

String.format("%.2f", number); 

So können Sie entweder zurückgeben String (Ihren Rückgabetyp von Doppel ändern) oder nur formatiert werden, wenn Sie es mit dem Code oben angezeigt werden müssen. Sie können read the JavaDoc for Formatter, um alle Möglichkeiten mit der Anzahl der Dezimalstellen, Komma Platzierung, etc.

+0

Danke, Jean's Lösung, die die gleiche ist wie deine, hat reibungslos funktioniert. –

+0

Nur eine Anmerkung, obwohl sie die Ausgabe nicht beeinflusst: Die '1' in Ihrer Formatzeichenkette hat hier wenig Wirkung, da sie die minimale Feldbreite für die ganze Sache einstellt. Da Sie es auch in der Form '.99' angeben, muss es schon mehr sein. – paxdiablo

+0

Danke @paxdiablo. Ich hatte es als etwas anderes (formatiert mit Komma-Trennzeichen, das ich persönlich benutze) und änderte es dann, um einfacher zu sein und in meiner Eile verließ die "1" in. Korrigiert jetzt, danke! – Todd

3

1.5 ist, die Anzahl der signifikanten Stellen ungeachtet der dasselbe als 1.50 (und sogar 1.5000000000000).

Sie müssen den Wert der Nummer von seiner Präsentation trennen.

Wenn Sie es Ausgang mit zwei Dezimalstellen, nur String.format verwenden, wie zum Beispiel mit:

public class Test 
{ 
    public static void main(String[] args) { 
     double d = 1.50000; 
     System.out.println(d); 
     System.out.println(String.format("%.2f", d)); 
    } 
} 

die Ausgänge:

1.5 
1.50 

Wenn Sie noch eine Funktion, die alle das tut für Sie und gibt Ihnen ein bestimmtes Format, müssen Sie die Zeichenfolge mit etwas zurückgeben:

public static String roundOff(double num, double acc, String fmt) { 
    num *= acc; 
    num = Math.ceil(num); 
    num /= acc; 
    return String.format(fmt, num); 
} 

und nennen Sie es mit:

resultString = roundOff(value, 20, "%.2f"); // or 100, see below. 

Dies ermöglicht es Ihnen, die Genauigkeit und Ausgabeformat in irgendeiner Weise Sie wünschen zuzuschneiden, obwohl Sie können immer noch hart Code die Werte, wenn Sie Einfachheit wollen:

public static String roundOff(double num) { 
    double acc = 20; 
    String fmt = "%.2f"; 
    num *= acc; 
    num = Math.ceil(num); 
    num /= acc; 
    return String.format(fmt, num); 
} 

Ein letzter Hinweis: Ihre Frage besagt, dass Sie abrunden wollen „zwei Dezimalstellen“, aber das nicht ganz Gel mit der Nutzung von 20 wie die Genauigkeit, da das wird rund es bis zum nächsten Vielfachen von 1/20. Wenn Sie wirklich wollen es aufgerundet auf zwei Dezimalstellen, der Wert, den Sie für accuracy verwenden sollten, ist 100.

+0

Danke, für die ausführliche Erklärung. –

+0

In Ihrem letzten kleinen Snippet haben Sie zwei verschiedene Variablen namens 'acc' (ein Parameter, eine lokale) und zwei verschiedene Variablen namens' fmt'. Dann verwenden Sie eine Variable namens "Genauigkeit", die scheinbar nicht existiert. Vielleicht möchten Sie das beheben. –

+0

@David, _damn_ diese cut'n'paste Fehler :-) Danke dafür, jetzt behoben. – paxdiablo

0

du versuchen können, wenn Sie wollen, ist ein String Ausgabe

double number = roundOff(1.499);//1.5 

DecimalFormat decimalFormat = new DecimalFormat("#.00"); 
String fromattedDouble = decimalFormat.format(number);//1.50 

Die Funktion Abrundungs ​​die gleiche ist, wie Sie in Ihrer Frage erwähnt.