# Rundungsfehler: 1.400000001 statt 1.4!



## frager (1. Dezember 2007)

Hallo community!

ich habe hier ein kleines Problemchen, und zwar werden double-Zahlen nach einigen Berechnungen so haesslich wie in der Ueberschrift, z.b. 1.400000001 wobei man eigentlich 1.4 erwarten wuerde!

hier der Code:

```
public class test
{
	public static void main(String[] args)
	{
		double intX;
		
		double minX = -2;
		double maxX = 2;
		int canW = 934;
		
		int pot;
		
		// intX berechnen
		intX = (maxX-minX)*40/canW;
		System.out.println("intX=" + intX);
		
		// intX auf eine gueltige Stelle runden
		for(pot = 0; intX < 1; intX*=10, ++pot)
			;
		intX = (int)(intX+1); // == Math.ceil(intX);
		while(pot-- > 0)
			intX /= 10;
		System.out.println("intX gerundet=" + intX);
		
		// den Bereich [minX, maxX] in intX-grosse Intervalle aufteilen
		for(double i = intX*Math.ceil(minX/intX); i < maxX; i+=intX) {
			System.out.println("" + i);
		}
	}
}
```
Hat jemand Ideen?
Oder geht es vllt.einfacher, eine Kommazahl auf eine gueltige Stelle zu runden? (im Beispiel ist es intX)

Danke!! frager


----------



## Busi (1. Dezember 2007)

Also ich habe mir mal sagen lassen:

DAS IST SO

und ich habe mich damit abgefunden.


----------



## zeja (1. Dezember 2007)

Mit BigDecimal kannst du ordentlich runden.


----------



## Pius Hermit (2. Dezember 2007)

Ansonsten, wenn Du genau eine oder 2 Nachkommastellen haben willst,
x0 = (int)x
x1 = (int)((x - x0)*10)
x2 = (int)((((x - x0)*10)-x1)*10)


bzw. z: 0,1,2,...
public int nachkommaStelle(double x, int z){
int i
if (z=0) i = (int)x;
else i = (int)((x - nachkommaStelle(x-x0, z-1))*10);
return i;
 }

ungefähr so...


----------

