Witam!
Czemu jak chce odjąć:
public static void main(String[] args) {
long liczba1 = 10 * 50 * 100 * 1000 * 1000;
long liczba2 = 10 * 50 * 100 * 1000;
System.out.println(liczba1/liczba2);
}
to wyskakuje -30 zamiast 1000 ??
Witam!
Czemu jak chce odjąć:
public static void main(String[] args) {
long liczba1 = 10 * 50 * 100 * 1000 * 1000;
long liczba2 = 10 * 50 * 100 * 1000;
System.out.println(liczba1/liczba2);
}
to wyskakuje -30 zamiast 1000 ??
No ale ty nie odejmujesz tyko dzielisz ...
Przekraczasz maksymalny rozmiar tego typu i liczba sie "przekreca". Zapewne masz 32-bitowy system.
static BigInteger Czynniki_Pomnoz(String... czynniki)
{
BigInteger output = new BigInteger(czynniki[0]);
int a = czynniki.length;
for(int i=1;i<a;i++)
output = output.multiply(new BigInteger(czynniki[i]));
return output;
}
public static void main(String[] args) {
BigInteger liczba1 = Czynniki_Pomnoz("10","50","100","1000");
BigInteger liczba2 = Czynniki_Pomnoz("10","50","100");
System.out.println(liczba1.divide(liczba2));
}
Przy większych liczbach musisz wykorzystać tę klasę i jej metody.
n0name_l napisał(a):
Przekraczasz maksymalny rozmiar tego typu i liczba sie "przekreca". Zapewne masz 32-bitowy system.
Long w Javie jest zawsze 64-bitowy. Int jest zawsze 32-bitowy.
Long
!= long
.int
, a ten typ jest 32-bitowy (tak umiem czytac dokumentacje)L
do jednej badz kilku mnozonych liczb:public class Main
{
public static void main(String [] args)
{
long liczba1 = 10 * 50 * 100 * 1000 * 1000;
long liczba2 = 10 * 50 * 100 * 1000;
System.out.println(liczba1/liczba2);
long liczba3 = 50000000000L;
long liczba4 = 10 * 50 * 100 * 1000;
System.out.println(liczba3/liczba4);
long liczba5 = 10L * 50L * 100L * 1000L * 1000L;
long liczba6 = 10 * 50 * 100 * 1000;
System.out.println(liczba5/liczba6);
long liczba7 = 10 * 50 * 100 * 1000 * 1000L;
long liczba8 = 10 * 50 * 100 * 1000;
System.out.println(liczba7/liczba8);
}
}
- Defaultowo vm uzyje typu int, a ten typ jest 32-bitowy (tak umiem czytac dokumentacje)
Nie VM, a kompilator.
Dobrze trafiłeś - domyślnie liczby są traktowane jako inty, więc by mieć wynik 64-bitowy trzeba dodać L zanim (bo liczone jest od lewej do prawej) się wynik przepełni.
Obliczenia w Javie wykonują się tak samo, bez względu na to ile bitów mają rejestry procesora, na jaką architekturę jest VMka itp itd Long/ long to zawsze 64-bity, Integer/ int to zawsze 32-bity. Jedynie liczby zmiennoprzecinkowe mogą inaczej działać, ale wystarczy dać strictfp
i już jest wszędzie identycznie.