2012-01-06 11 views
14

Czytałem o typach danych w C. Znalazłem zakres long double jest więcej niż double w java. Dla bardzo dużej liczby możemy użyć długiego podwójnego w C. Jeśli chcę przechowywać ten sam numer w java, co musimy zrobić? jakiego typu danych możemy użyć?Czy w java występuje zastąpienie długiego podwójnego?

dwukrotnie w Java trwa 8 bajty (64 bity), IEEE 754. Obejmuje ona zakresie od 4.94065645841246544e-324D do 1.79769313486231570e + 308D (dodatnie lub ujemne).

longdouble in c takes 10 bytes (80 bits) 

Czy ktoś może mi powiedzieć, czy jest jakiś wymiana longdouble w java

+3

Spróbuj BigDecimal. –

+0

Bigdecimal nie jest datem, którego nie możemy wykonywać operacji arytmetycznych bezpośrednio za pomocą operatorów arytmetycznych. –

+0

'long double' jest kompilatorem specyficznym dla C, na większości platform jest tego samego rozmiaru co' double'. –

Odpowiedz

9

Mimo że nie jest zamiennikiem, można użyć java.lang.math.BigDecimal. Z grubsza można przechowywać miliard cyfr, dopóki nie skończy się pamięć. Jest to arbitralna klasa dokładności, która będzie tak duża, jak chcesz, aż skończy Ci się pamięć komputera.

Zgodnie z dokumentacją BigDecimal:

niezmienne, arbitralny precyzji podpisane liczb dziesiętnych. BigDecimal składa się z arbitralnej wartości całkowitej nieskalowanej liczby całkowitej i nieujemnej 32-bitowej skali całkowitej, która reprezentuje liczbę cyfr po prawej stronie przecinka dziesiętnego. Liczba reprezentowana przez BigDecimal to (unscaledValue/10scale). BigDecimal zapewnia operacje dla podstawowych operacji arytmetycznych, skalowania, porównania, konwersji i konwersji formatu.

+1

Ale nie mogę używać operatorów arytmetycznych do obliczeń arytmetycznych takich jak dodawanie, odejmowanie itp. –

+0

@SunilKumarSahoo Posiada metodę, która robi to samo. Zasugerowano, że operatory wsparcia Java dla BigInteger i BigDecimal. –

+0

i BigDecimal nie cierpią na błędy niedokładności –

3

Nie ma proste zastąpienie w Javie. W tym celu można użyć BigDecimal.

Powinieneś rozumieć, że im większa jest twoja podwójna wartość, tym większa utrata precyzji, którą otrzymasz, używając go w operacjach matematycznych. BigDecimal pomaga uświadomić sobie ten problem.

Oto przykładowy kod z BigDecimal:

String decimalString = "1423545135143513.523"; 
BigDecimal decimal = new BigDecimal(decimalString); 

By this link można znaleźć wiele przykładów z wykorzystaniem klasy BigDecimal.

+0

Ale nie mogę używać operatorów arytmetycznych do obliczeń arytmetycznych takich jak dodawanie, odejmowanie itp. –

+0

Możesz. na przykład decimal.divide (new BigDecimal ("11.11")); Proszę, przeczytaj API przez link, który napisałem. Edytowałem mój wpis, śledziłem link i poznałem kilka przykładów. – Artem

+0

decimal.divide() nie jest operatorem, jest metodą? Wspomniałem w moich komentarzach, że nie możemy używać operatorów arytmetycznych –

2

Jeśli chodzi o typ pierwotny, nie ma żadnych asów z podwójnego i zmiennoprzecinkowego, który obsługuje zmiennoprzecinkowe.

Ale, BigDecimal może być tym, czego szukasz.

+0

Ale nie mogę używać operatorów arytmetycznych do obliczeń arytmetycznych takich jak dodawanie, odejmowanie itp. –

+0

Nie można używać zwykłych operatorów arytmetycznych, ponieważ jest to obiekt. Będziesz musiał użyć metod w API, takich jak .add(), .subtract(), etc ... To jest trochę żmudne, ale w zamian będziesz miał więcej mocy i innych wymyślnych operacji. Ale bądź ostrożny z dzieleniem, ponieważ będzie on wyrzucał wyjątki, jeśli jest równy 1/3, to będzie niekończącym się dziesiętnym rozwinięciem. – HeavenAgain

1

Dokumentacja BigDecimal stwierdza:

add (BigDecimal augend) Zwraca BigDecimal którego wartość jest (to + augend), a jego waga wynosi max (this.scale(), augend.scale()).

import java.math.BigDecimal; 

    public class AddTwoBigNumbers{ 
     public static void main(String[] args) { 
     BigDecimal num1, num2; 
     num1 = new BigDecimal(50.00035); 
     num2 = new BigDecimal(100.0025); 
     Sum(num1, num2); 
     } 

     public static void Sum(BigDecimal val1, BigDecimal val2){ 
     BigDecimal sum = val1.add(val2); 
     System.out.println("Sum of two BigDecimal numbers: "+ sum); 
     } 
    } 
0

Nie, ale można użyć Java Native Interface zadzwonić natywną metodę, która wykonuje obliczenia z wykorzystaniem długiego typu double.Następnie możesz zapisać go w 10 bajtach lub przyciąć.

Jeśli ostateczne skrócenie do podwojenia jest dopuszczalne, w zależności od używanej maszyny wirtualnej możliwe jest, że wartości pośrednie są mimo wszystko przechowywane w długim podwójnym układzie. W tym przypadku nie potrzebujesz natywnej metody.

Powiązane problemy