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 ?
ilosc_miejsc_po_przecinku = 20
double liczba = new BigDecimal( liczba ).setScale( ilosc_miejsc_po_przecinku, BigDecimal.ROUND_HALF_UP).doubleValue();
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.
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);
}
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.