» »

[Java] Deljenje in ostanek

[Java] Deljenje in ostanek

pr2501 ::

Naslednji program v javi mi vrne rezultat: 0,0
public class deljenje
{
   public static void main(String [] args)
   {
      double C = 5/9;

      System.out.println("Rezultat deljenja je:" + C  );
   }
}


Command prompt:
D:\literatura_java\moji programi60>java deljenje
Rezultat deljenja je:0.0

kako definirati racijonalno st. ?
Hvala
konec
  • spremenilo: CCfly ()

matejv ::

double C = 5.0/9.0;

poskusi tako

Meto ::

ali to zgoraj, ali pa uporabi

double c = (double) 5/9
Šola je za neumne.

pr2501 ::

Rezultat deljenja je:0.5555555555555556


Hvala
konec

pr2501 ::

Z obema nacinoma.
konec

OwcA ::

Poglavitno vprašanje je, ali razumeš zakaj so rezultati takšni kakršni so.
Otroška radovednost - gonilo napredka.

jogurtIR ::

Še ena rešitev:

public class Deljenje
{
   public static void main(String [] args)
   {
      double C = 5d/9d;

      System.out.println("Rezultat deljenja je:" + C  );
   }

Zgodovina sprememb…

  • spremenilo: CCfly ()

pr2501 ::

Bral sem o tem. samo to spada v tisto podrocje mojega dojemanja, ki je nerazumljivo iz knjig.
In se ce mi poskusa nekdo razloziti je vprasanje , ce mu bo uspelo.
Torej,...,
zakaj ce sem rekel, da je double, mu moram po enacaju se enkrta to povedati ?

Oz, zakaj uporabisti (cast)? Se opravicujem je ze nekaj dni odkar sem bil v tem, ce sem narobe napisal.

ce si poskusam sam odgovoriti:
Java gleda stevila: in stevilo 9 je int (kot short, int, long (v glavnem ni decimalne vejice)) in racuna, kot da je int.
Samo zakaj, pol izpise recimo ce povem da bo rezultat deljenja: 9/5 spremenljivka double: 1.0( tu noter je decimalna vejica - pol ve' , da je double ?

razumem, da sprasujem, kot negdo, ki nima pojma, samo vseno bi prosil za malo potrpezljivosti pri odgovoru-razlagi.
Hvala
konec

OwcA ::

Najprej se ovrednoti (zračuna) desna stran enačaja, v našem primeru celoštevilsko (vse decimalke so porezane) deljejenje 5/9, kar nanese 0. Ker je rezultat int, ne double, kot bi moral biti, je implicitno pretvorjen v slednje in prirejen spremenljvki C.

Težava je torej v celoštevilskem deljenju. Temu se izognemo tako, da spremenimo vsaj enega od operandov v double. Načinov kako to zapisati je več in jih lahko razdelimo v dve kategoriji:

1) decimalen zapis števila (5.0 ali 5d)
2) eksplicitna pretvorba (double) 5.
Izpostaviti velja, da ima pretvarjanje prednost pred skoraj vsemi ostalimi operacijami, tako (double) 5/9 pretvori le 5 v 5.0 in ne rezultata deljenja, kot se je zgodilo v izvornem primeru.
Otroška radovednost - gonilo napredka.

Gundolf ::

Kar se morda zdi nam popolnoma samoumevno, nekaterim začetnikom pa dela resne preglavice je tole:
to kar je na levi strani enačaja Javi (in podobnim jezikom) ne pomeni prav nič, ko računa desno stran. Torej najprej se poračuna kar se mora 5/9 - kjer sta obe števili celi in je zato rezultat celo število. Potem pa Java šele pogleda kaj mora z rezultatom narediti in v tvojem primeru ga mora shraniti v double. Torej potek izračuna ni tak kot si ti misliš - da bi se najprej določil tip rezultata in nato izbrala primerna operacija. Zakaj pa Java ve kaj hočeš ko rečeš 5.0/9.0? Zato ker 5.0 je konstanta tipa float (ali double, ne vem kako ima to Java točno spedenano) in v tem primeru naredi foat deljenje. Ja, tudi konstante imajo svoj tip. Drugače pa se pri operacijah nad različnimi tipi vedno najprej sodelujoči tipi pretvorijo v najbolj splošnega izmed njih, nato pa se izvede operacija razlog je povsem praktične narave - računalnik (poleg Javinega virtualnega računalnika tudi večina ostalih) zna delati te osnovne operacije le nad spremenljivkami istega tipa. Tako da tudi 5.0/9 in 5/9.0 čisto lepo deluje (v obeh primerih se najprej številka tipa int prevede v float, potem pa se deli).

pr2501 ::

zadnjih nekaj dni sem porabil, da dojamem da je ucenje Jave enako ucenju nekega novega jezika in še da to sprejmem.

Zahvaljujem se za preprosto razlago:
"ce recem da bo rezultat neke matematicne operacije "double", ne pomeni še to tega da se bodo
morali operandi v racunu spremeniti v "double""

Zelim vam lep Silvesterski vecer
konec

JDK6 ::

pr2501 pomojem je imel ta problem skoraj vsak, ki je zacel programirati v Javi.

Bom malo malenkosten, samo 5.0 je tipa double[1], nisem si mogel pomagati, da ne bi komentiral.

[1] http://java.sun.com/docs/books/jls/thir...

pr2501 ::

Enaka verzija programa mi je delala (prikazala vse elemente), ko je bilo vse znotraj main bloka. Sedaj pa mi prikaze le glavni okvir in dva mala kvadratka noter (panel).
Program bi moral prikazati v glavnem okvirju dva panela: ploskev, ploskev1 z vsemi pripadajocimi elementi (gumbi, labelami,comboboxi).
Preikazemi pa le dva kvadratka, ki predvidevam da sta panela.
Mislim da nebom nic zgresil ce povem, da mi deluje le main del programa.
Kaj mi bi lahko gdo prosim razlozil te osnove ?
In takoj bom vprasal se eno stvar, ki mi bo dosti pomagala:
Kako se v ene projektu zdruzi vec razredov ?
V naprej hvala in zelim vam cimuspesnejse leto.

import java.awt.*;
import javax.swing.*;
import javax.swing.border.LineBorder;

import java.awt.event.*;

public class sreda extends JPanel{

String izbira [] = {"10","20"};
JPanel ploskev, ploskev1;
// JLabel z_tem,h_tem ,c_tem ;

public sreda (){

try {
UIManager.setLookAndFeel (
UIManager.getCrossPlatformLookAndFeelClassName());
} catch (Exception e){}

//ploskev
JLabel z_tem = new JLabel("Zeljena tem");
JLabel h_tem = new JLabel("Dovoljeno odstopanje");
JLabel c_tem = new JLabel ("Kriticna tem");



JComboBox Tem_w = new JComboBox ();
//gumb.addActionListener(this);
for (int i=0; i< izbira.length; i++) {
Tem_w.addItem(izbira[i]);
// pogruntaj DODAJANJE SE ENEGA ELEMENTA
}
Tem_w.setEditable(true);
Tem_w.setSelectedIndex(1);
Tem_w.setMaximumRowCount(4);
ploskev.add(Tem_w);

JComboBox Tem_H = new JComboBox ();
for (int i=0; i< izbira.length; i++) {
Tem_H.addItem(izbira[i]);
}
Tem_H.setEditable(true);
Tem_H.setSelectedIndex(1);
Tem_H.setMaximumRowCount(4);
ploskev.add(Tem_H);

JComboBox Tem_C = new JComboBox ();
for (int i=0; i< izbira.length; i++) {
Tem_C.addItem(izbira[i]);
}
Tem_C.setEditable(true);
Tem_C.setSelectedIndex(1);
Tem_C.setMaximumRowCount(4);
ploskev.add(Tem_C);

ploskev.setLayout(new GridLayout(2,3,20,0));
ploskev.add(z_tem);
ploskev.add(h_tem);
ploskev.add(c_tem);
ploskev.add(Tem_w);
ploskev.add(Tem_H);
ploskev.add(Tem_C);

// ploskev1
JToggleButton gre = new JToggleButton ("GRELEC",false);
JToggleButton ven = new JToggleButton ("VENT", false);
JToggleButton STIKALO = new JToggleButton ("AVTOMATSKO", true);

ploskev1.add(STIKALO);
ploskev1.add(gre);
ploskev1.add(ven);
ploskev1.setLayout(new FlowLayout(FlowLayout.CENTER,19,10));
}
// frame
public static void main (String[] args){


JFrame okvir = new JFrame ("TIBET");
Container vsebina = okvir.getContentPane();
vsebina.setLayout(new FlowLayout(FlowLayout.CENTER,10,10));
JPanel ploskev1 = new JPanel ();
//ploskev1.setSize(50,50);
ploskev1.setBorder(new LineBorder (Color.gray));
JPanel ploskev = new JPanel ();
ploskev.setBorder(new LineBorder (Color.gray));
vsebina.add(ploskev1);
vsebina.add(ploskev);

okvir.setSize(600,300);
okvir.setVisible(true);
okvir.getContentPane().add(ploskev,BorderLayout.CENTER);
okvir.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);


}


}
konec

JDK6 ::

Za zacetek imena razredov so vedno z Veliko zacetnico. Ce smo javanci na kaj alergicni smo na razrede z malo zacetnico, to ne obstaja! Beri obstaja nek dogovor v Javi

Imena razredov z Veliko zacetnico in CaMelCase

MojSuperRazred (pravilno)

moj_Super_Razred (nepravino)
Mojsuperrazred (nepravilno)

Imena konstant vse z veliko in _ namesto CamelCasa

MOJA_SUPER_KONSTANTA (pravilno)

mojaSuperKonstanta (nepravilno)
MOJASUPERKONSTANTA (nepravilno)

t.i. getterji in setterji

private int something;

public int getSomething(){ return something;}
public void setSomething(int i) {something =i;}

torej

private Type XXX;

//getter
public Type getXXX(){...}

//setter
public void setXXX(Type xxx){...}

imena spremenljivk naj bodo z malo in CamelCase uporaba _ ni proporocljiva, in deskriptivna

z_tem (ne priporocljivo) -> napisTema (priporocljivo)

Kot drugo pa naj bi vsaka stvar, ki je public vsebovala JavaDoce e.g.

/**
* Panela za uporabo v ....
*
* @author JDK6
*
*/
public class sreda extends JPanel {

/**
* Ustvari novo panelo z ...
*/
public sreda() {


To je v vecini vse. Ni se tezko tega drzat.

Main metoda bi bilo bolje, ce bi zgledala kaj v stilu

main{

JFrame frame = new Sreda();

frame.setSize(PREF_WIDTH, PREF_HEIGHT);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

frame.setVisible(true);

}

pr2501 ::

Poskusal se bom drzati reda ze v mojem nasleddnjem postu.
Prosim za potrpezljivost dokler se ne naucim in za nadaljne popravke.
Hvala
konec


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Mala pomoč pri javi

Oddelek: Programiranje
81141 (972) Serial
»

[Java] Ne zažene appleta

Oddelek: Programiranje
51213 (1146) iggy
»

[Java] Zagon appleta v HTML

Oddelek: Programiranje
161545 (1367) Bela01
»

[JAVA] branje iz datoteke

Oddelek: Programiranje
242412 (2047) Bela01
»

[NALOGA][Java] Težave pri pisanju slikarja

Oddelek: Programiranje
202295 (1937) l0g1t3ch

Več podobnih tem