okreslenie liczby miejsc po przecinku w bigDecimal

0

Czy ktos wie moze jak zrobic w BigDecimal zeby notacja naukowa (np. E-19) pojawiala sie po 20 miejscach po przecinku a nie domyslnie po 6 ?

0

ilosc_miejsc_po_przecinku = 20
double liczba = new BigDecimal( liczba ).setScale( ilosc_miejsc_po_przecinku, BigDecimal.ROUND_HALF_UP).doubleValue();

0
gosc napisał(a)

ilosc_miejsc_po_przecinku = 20
double liczba = new BigDecimal( liczba ).setScale( ilosc_miejsc_po_przecinku, BigDecimal.ROUND_HALF_UP).doubleValue();

chodzilo mi bardziej o to zeby mnozac ciagle 0.1 * 0.1 poczatkowo liczba bzla zapisywana jako np. 0.00001 a po przekroczeniu pewnej liczby miejsc po przecinku jako np. 1E-150.

Ponizej przedstawie rozwiazanie do ktorego doszedlem ale nie jest ono zbyt eleganckie.

public class Obliczenia {

BigDecimal liczba1, liczba2;

NumberFormat numberformat = NumberFormat.getInstance();

public Obliczenia() {
	numberformat.setMinimumFractionDigits(0);
	numberformat.setMaximumFractionDigits(2147483647);
	numberformat.setGroupingUsed(false);
}  

public String mnozenie(String a, String b) {
BigDecimal rownaSie = new BigDecimal(0);
liczba1 = new BigDecimal(a, new MathContext(17));
liczba2 = new BigDecimal(b, new MathContext(18));
rownaSie = liczba1.multiply(liczba2, new MathContext(35, RoundingMode.HALF_UP));
if (numberformat.format(rownaSie).toString().length() >= 36){
return rownaSie.toString();
}
else
return numberformat.format(rownaSie).toString().replace(',', '.');
}

}

rozwiazanie nie podoba mi sie ze wzgledu na sztywne okreslanie maksymalnej ilosci liczb po przecinku. poza tym podalem maksymalna liczbe dla int poniewaz zarówno setMaximumFractionDigits jak i przy metodzie setScale() jezeli liczba miejsc po przcinku przekroczy zadeklarowane maximum to wyswietlone zostanie 0 a tak byc nie moze.

0

O cos takiego Ci chodzi ?

	private static void drukuj( double a, int ilosc_miejsc ) {
		String word = new BigDecimal( a ).toPlainString();
		
		if( word.length() > ilosc_miejsc ) {
			String tmp = String.copyValueOf(word.toCharArray(), 0, ilosc_miejsc);
			
			char liczba = '0';
			
			///////////////////////////////////////////////
			// Jeśli chcesz pierwszą 
			for( int i = 0; i < word.length(); i++ )
				if( word.charAt(i) > '0') {
					liczba = word.charAt(i);
					break;
				} 
			//////////////////////////////////////////////
			// Jeśli chcesz ostatnią
			/*for( int i = 0; i < word.length(); i++ )
				if( word.charAt(i) > '0') {
					liczba = word.charAt(i);
				} 
			*/
			String[] result = Double.toString(a).split("E");
			
			System.out.println( tmp + liczba +  "E" + result[1]);
		} else {
			System.out.println( word );
		}
			
	}
	
	public static void main(String[] args) {
		drukuj( 0.001* 0.000000001, 3);
		
	}
0

chodzi mi o to zebym mogl wykonac dzialanie:
0.1 * 0.1 = 0.01
0.01* 0.1 = 0.001
0.001 * 0.1 = 1E-4
.. i tak w nieskonczonosc albo poki proc nie siadzie:)

Czyli do pewnego momentu liczba jest zwracana normalnie a pozniej w notacji naukowej.

Czy twoja metoda maila w zalozeniu pokazywac cos takiego??
Pytam poniewaz jezeli liczba miejsc po przecinku jest mniejsza niz zmienna ilosc_miejsc wyskakuje wyjatek, a i w przykladzie ktory wpisales nasztywno wynik powinien byc 1E-12 a nie 1.01E-12.

1 użytkowników online, w tym zalogowanych: 0, gości: 1