WCM Forum

WCM Forum (http://www.wcm.at/forum/index.php)
-   Programmierung (http://www.wcm.at/forum/forumdisplay.php?f=17)
-   -   java - runden auf bestimmte dezimalstellenanzahl (http://www.wcm.at/forum/showthread.php?t=49138)

RaistlinMajere 09.03.2002 23:01

java - runden auf bestimmte dezimalstellenanzahl
 
Code:

import java.text.*;

double zahl = 1234.56789;

DecimalFormat df = new DecimalFormat("#0.00");
System.out.println(df.format(zahl));

ergibt dann als ausgabe 1234,57

nur ist das ein STRING, angenommen, ich würde mit der zahl weiterrechnen wollen, wie würde der typ erhalten bleiben, anstatt in einen string umgewandelt zu werden?

Flink 09.03.2002 23:11

Re: java - runden auf bestimmte dezimalstellenanzahl
 
Zitat:

Original geschrieben von RaistlinMajere

ergibt dann als ausgabe 1234,57
nur ist das ein STRING, angenommen, ich würde mit der zahl weiterrechnen wollen, wie würde der typ erhalten bleiben, anstatt in einen string umgewandelt zu werden?

Du hast doch
Code:

double zahl = 1234.56789;
immer noch. Verwende diese zahl zum weiterrechnen.

RaistlinMajere 09.03.2002 23:20

ist mir schon klar, daß ich das kann.
nur ich hätte gern gewußt, ob es denn keine möglichkeit gäbe, aus dem ergebnis der rundung heraus noch etwas arithmetisches zu machen. rein interessehalber. oder müßte ich sämtliche arithmetische operationen zuerst machen und erst am schluß dann die rundung vollführen? was wäre, wenn der gerundete wert ein zwischenergebnis wäre, daß ich nicht nur ausgeben, sondern das ich auch in irgendeiner rechnung in der gerundeten form weiterverwenden will?

es muß doch eine möglichkeit geben, auf eine bestimmte stellenzahl zu runden und doch keine typenumwandlung vorzunehmen, so daß ich das ergebnis arithmetisch weiterverwerten kann.

Flink 09.03.2002 23:34

Du kannst Dir natürlich auch über DecimalFormat.parse() einen NumberValue besorgen und über doubleValue() wiederum die gerundete double -Zahl zum Weiterrechnen holen.

Nachzulesen im
Java 2 Platform SE v1.3.1 .

RaistlinMajere 10.03.2002 00:53

Code:

double zahl2 = doubleValue(df.parse(zahl));
funzt ned... was mach ich falsch?

Flink 10.03.2002 09:55

Code:

double zahl2 = (df.parse(zahl)).doubleValue();
Probier's aus! Ich habe es jetzt nicht selber getestet. :o

RaistlinMajere 10.03.2002 11:43

Code:

import java.text.*;

public class runden {

    double zahl = 1234.56789; 
    DecimalFormat df;
   
    public runden() {
        df = new DecimalFormat("#0.00");
        System.out.println(zahl);
        System.out.println(df.format(zahl));
        System.out.println(df.parse(zahl).doubleValue());
    }
   
    public static void main(String[] nix) {
        new runden();
    }
}


runden.java [12:1] cannot resolve symbol
symbol : method parse (double)
location: class java.text.DecimalFormat
System.out.println(df.parse(zahl).doubleValue());
^
1 error
Errors compiling runden().

RaistlinMajere 10.03.2002 13:51

hm, ist mir mittlerweile schon klar, warum das nicht geht (nur leider kann ich den beitrag nimma editieren), den parser mit double zu füttern, ist natürlich unsinn.
ich müßte zuerst das ergebnis als string haben und dann damit den parser füttern, nur das problem ist, daß im string das kommazeichen kein PUNKT mehr ist, sondern ein BEISTRICH, damit kommt der parser dann auch nicht mehr zurecht.
mir ist jetzt nur noch eine reichlich unelegante methode eingefallen, nämlich die:

Code:

double zahl = 1234.5678;
String zahlstring;
DecimalFormat df = new DecimalFormat("#0.00");       

zahlstring = df.format(zahl); // -> 1234,67
zahlstring = zahlstring.replace(',', '.');
System.out.println(Double.parseDouble(zahlstring)+1);

das +1 hab ich nur drangegeben, weil ich wissen wollte, ob ich jetzt wirklich mit dem parsergebnis (sozusagen eine doppelte überprüfung, weil wenns nicht so wäre, müßte ja schon beim parsen irgendein fehler kommen) weiterrechnen kann, ja, kann ich.

JosefS 10.03.2002 19:17

Re: java - runden auf bestimmte dezimalstellenanzahl
 
Zitat:

Original geschrieben von RaistlinMajere
Code:

import java.text.*;

double zahl = 1234.56789;

DecimalFormat df = new DecimalFormat("#0.00");
System.out.println(df.format(zahl));

ergibt dann als ausgabe 1234,57

nur ist das ein STRING, angenommen, ich würde mit der zahl weiterrechnen wollen, wie würde der typ erhalten bleiben, anstatt in einen string umgewandelt zu werden?

nimm:
Code:


double zahl = 1234.56789;
double dNeueZahl;

dNeueZahl = double ( int (zahl * 100)) / 100;
System.out.println( dNeueZahl );


RaistlinMajere 10.03.2002 19:37

ist ein interessantes verfahren, nur bist du dir sicher, daß das nicht
Code:

dNeueZahl = (double) ((int) (zahl * 100)) / 100;
heißen sollte?

außerdem hat das ganze einen haken, du bekommst nämlich als ergebnis 1234.56, die letzte stelle wird also nicht gerunden, sondern es werden lediglich die unerwünschten kommastellen abgeschnitten.

JosefS 10.03.2002 19:45

Zitat:

Original geschrieben von RaistlinMajere
ist ein interessantes verfahren, nur bist du dir sicher, daß das nicht
Code:

dNeueZahl = (double) ((int) (zahl * 100)) / 100;
heißen sollte?

außerdem hat das ganze einen haken, du bekommst nämlich als ergebnis 1234.56, die letzte stelle wird also nicht gerunden, sondern es werden lediglich die unerwünschten kommastellen abgeschnitten.

hm... okok hab die klammern vergessen

Code:

dNeueZahl = (double) ((int) (zahl * 100) + 5) / 100;
und schon isses auch gerundet ;-)

RaistlinMajere 10.03.2002 20:03

verstehe ich nicht, verfolg das doch mal:

zahl * 100 ergibt 123456.789
dann machst daraus nen integer, wird also 123456
dann +5, also 123461
dann machst ein double daraus, also 123461.0
und dann /100, also 1234.61

stimmt aber nicht, es sollte 1234.57 rauskommen, das wäre korrekt auf 2 stellen gerunden.

JosefS 10.03.2002 20:15

Zitat:

Original geschrieben von RaistlinMajere
verstehe ich nicht, verfolg das doch mal:

zahl * 100 ergibt 123456.789
dann machst daraus nen integer, wird also 123456
dann +5, also 123461
dann machst ein double daraus, also 123461.0
und dann /100, also 1234.61

stimmt aber nicht, es sollte 1234.57 rauskommen, das wäre korrekt auf 2 stellen gerunden.

hm... vieleicht sollte ich mal was nachrechnen, bevor ich einfach so poste!
dann halt:

dNeueZahl = (double) ((int) (zahl * 100 + 0.5)) / 100;

1234.56789 * 100 = 123456.789
123456.789 + 0.5 = 123457.289
int ( 123457.289 ) = 123457
123457/100 = 1234.57

hab mich um eine kommastelle vertan...

RaistlinMajere 10.03.2002 20:38

ja, jetzt passts. aber... wieso grad 0.5, wie bist du da drauf gekommen?

moorhahn 10.03.2002 20:43

wenn man es mit (int) castet, dann wird es ja nicht gerundet, sondern es werden einfach die kommastellen weggelassen, oder? in Math gibt es sicher was mit dem du es runden kannst, wenn du z.b. jbuilder von borland verwendest, müsste der dir eigentlich das zeug anzeigen wenn du Math. schreibst.
wenn du den string nimmst mit dem du das unformatierst, kannst du ja den string wieder in double umwandeln, mit doble.parseDouble(zahlstring), oder?

JosefS 10.03.2002 20:47

Zitat:

Original geschrieben von RaistlinMajere
ja, jetzt passts. aber... wieso grad 0.5, wie bist du da drauf gekommen?
denk mal selber drüber nach ;-)

beispiele:

1.34 gerundet = 1.3
1.35 gerundet = 1.4
dh. ab .5 wird die vorige stelle aufgerundet.
na, was muss man dann dazuzuählen, dass bis .4 nix ist und erst ab .5 die zahl vorige zahl um 1 erhöht wird? genau 0.05
und das ganze geht natürlich beliebig nach hinten...

:D

JosefS 10.03.2002 20:51

Zitat:

Original geschrieben von moorhahn
wenn man es mit (int) castet, dann wird es ja nicht gerundet, sondern es werden einfach die kommastellen weggelassen, oder? in Math gibt es sicher was mit dem du es runden kannst, wenn du z.b. jbuilder von borland verwendest, müsste der dir eigentlich das zeug anzeigen wenn du Math. schreibst.
wenn du den string nimmst mit dem du das unformatierst, kannst du ja den string wieder in double umwandeln, mit doble.parseDouble(zahlstring), oder?

eine zahl in string umwandeln um sie dann zu runden und wieder zurück ist mit kanonen auf spatzen schießen :utoh:

Tarjan 10.03.2002 22:19

Warum verwendet ihr nicht die Math.round() Funktion? Die ist für das geschrieben worden:

doubleZahl = ((double)Math.round(doubleZahl * 100)) / 100

RaistlinMajere 10.03.2002 22:53

Zitat:

Original geschrieben von Tarjan
Warum verwendet ihr nicht die Math.round() Funktion? Die ist für das geschrieben worden:

doubleZahl = ((double)Math.round(doubleZahl * 100)) / 100

stimmt, simpler dürfte es wohl nicht mehr gehen.

Tarjan 11.03.2002 09:32

Bin nacher noch draufgekommen, geht auch ohne expliziten Cast:
doubleZahl = Math.round(doubleZahl * 100) / 100.0


Alle Zeitangaben in WEZ +2. Es ist jetzt 10:14 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
© 2009 FSL Verlag