# Auf 2 Nachkommastellen runden



## foobar (6. Dez 2007)

Huhu,

wie kann man mit dem BigDecimal am einfachsten kaufmännisch runden? Ich habe es jetzt so gemacht:

```
private BigDecimal round(BigDecimal in)
{
        int len = (in.intValue()+"").length();
        return  in.round(new MathContext(len+ MAX, RoundingMode.HALF_DOWN));
 }
```
geht das nicht einfacher? 

Viele Grüße,
foobar


----------



## SlaterB (6. Dez 2007)

return in.setScale(2 (Nachkommastellen), RoundingMode.HALF_DOWN);


----------



## foobar (7. Dez 2007)

Danke 

Macht es eigentlich einen Unterschied, ob man HALF_UP oder HALF_DOWN verwendet? Ich konnte keinen festellen.


----------



## SlaterB (7. Dez 2007)

```
public class Test
{

    public static void main(String[] args)
        throws Exception
    {
        BigDecimal in = new BigDecimal("0.015");
        System.out.println(in.setScale(2, RoundingMode.HALF_DOWN));
        System.out.println(in.setScale(2, RoundingMode.HALF_UP));
    }
}
```


----------



## foobar (12. Dez 2007)

Und warum liefert das hier ein anderes Ergebnis:

```
public class Test
{

    public static void main(String[] args)
        throws Exception
    {
        BigDecimal in = new BigDecimal(0.015);
        System.out.println(in.setScale(2, RoundingMode.HALF_DOWN));
        System.out.println(in.setScale(2, RoundingMode.HALF_UP));
    }
}
```

Es scheint wohl einen Unterschied zu machen welchen Konstruktor von BigDecimal man verwendet.


----------



## SlaterB (12. Dez 2007)

jo, BigDecimal(double) ist schon recht böse,
auch wenn ich gerade keinen passenden Link zur Erklärung habe

```
public class Test
{

    public static void main(String[] args)
        throws Exception
    {
        BigDecimal b = new BigDecimal(0.015);
        System.out.println(b);
    }
}
```
->
0.01499999999999999944488848768742172978818416595458984375


----------



## foobar (13. Dez 2007)

SlaterB hat gesagt.:
			
		

> jo, BigDecimal(double) ist schon recht böse,
> auch wenn ich gerade keinen passenden Link zur Erklärung habe



Ich aber:


> #  The results of this constructor can be somewhat unpredictable. One might assume that writing new BigDecimal(0.1) in Java creates a BigDecimal which is exactly equal to 0.1 (an unscaled value of 1, with a scale of 1), but it is actually equal to 0.1000000000000000055511151231257827021181583404541015625. This is because 0.1 cannot be represented exactly as a double (or, for that matter, as a binary fraction of any finite length). Thus, the value that is being passed in to the constructor is not exactly equal to 0.1, appearances notwithstanding.
> # The String constructor, on the other hand, is perfectly predictable: writing new BigDecimal("0.1") creates a BigDecimal which is exactly equal to 0.1, as one would expect. Therefore, it is generally recommended that the String constructor be used in preference to this one.


Quelle: http://java.sun.com/javase/6/docs/api/java/math/BigDecimal.html#BigDecimal(double)

Da muß man erstmal drauf kommen. *g*


----------

