Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Java: Desimaalien pyöristäminen

Sivun loppuun

jojojojo [22.10.2019 13:51:12]

#

Olen koodausta aloittelela ja päätin aloittaa verkkokurssilla, mutta ongelmana on se , että en saa apua juuri silloin kun sitä tarvitsen. Seuraava kysymys ammattilaisille helppo, mutta itse olen paininut tämän kanssa jo kohta koko päivän enkä saa suoritettua tehtävää onnistuneesti.

Eli kyseinen tehtävä ja koodi jonka olen kyhännyt on seuraavanlainen:

lainaus:

Tee ohjelma, joka kysyy käyttäjältä ympyrän säteen ja laskee annetun säteen perusteella ympyrän pinta-alan. Lopuksi pinta-ala tulostetaan näytölle. Piin arvona käytetään likiarvoa 3.142. Käyttäjän oletetaan syöttävän kokonaislukuja.

Vihje:
Ympyrän pinta-ala lasketaan kaavalla:
A = π · r2, jossa r on ympyrän säde.

Ohjelma kirjoitetaan luokkaan, jonka nimi on ŽAlaŽ.

Esimerkkituloste:
Anna ympyrän säde:3
Ympyrän ala annetulla säteellä: 28.278
Ohjelman tarkastus ei huomioi tyhjiä merkkejä eikä erottele isoja ja pieniä kirjaimia

Sitten kyhäelmäni:

import java.io.*;

public class Ala {
	public static void main(String[] args) {
		int ympyrän_säde;
		double ympyrän_ala;

		BufferedReader in = new BufferedReader(new InputStreamReader(System.in));

		try {
			System.out.print("Anna ympyrän säde: ");
			ympyrän_säde = Integer.parseInt(in.readLine());

			ympyrän_ala = 3.142 * ympyrän_säde * ympyrän_säde;
			System.out.println("Ympyrän ala annetulla säteellä: " + ympyrän_ala);

			} catch(Exception e) {
			System.out.println("Antamasi syöte oli virheellinen...");
		}
	}
}

Ja tuloksena :

Anna ympyrän säde: 443
Ympyrän ala annetulla säteellä: 616614.358

ensimmäinen testitulostus on oikein, mutta toinen näyttää seuraavaa virhettä:

Anna ympyrän säde: 45
Ympyrän ala annetulla säteellä: 6362.549999999999

"Virhe tulostuksessa: ohjelmasi tulosti "6362.549999999999", vaikka tulostuksen olisi pitänyt olla "6362.55"

Eli jostain syystä näyttää liian tarkan arvon. Miten saan korjattua kyseisen ongelman? Kiitos jos joku viitsii vauvautua auttamaan, alkaa olla hyvin epätoivoinen olo tämän ongelman kanssa..

Grez [22.10.2019 13:56:24]

#

jojojojo kirjoitti:

Kiitos jos joku viitsii vauvautua auttamaan, alkaa olla hyvin epätoivoinen olo tämän ongelman kanssa..

Vauvaksi en viitsi ryhtyä, mutta olisiko DecimalFormat ratkaisu?

DecimalFormat df = new DecimalFormat("#.###");
System.out.println("Ympyrän ala annetulla säteellä: " + df.format(ympyrän_ala));

jojojojo [22.10.2019 14:11:48]

#

Kiitos. En kuitenkaan vieläkään pelkästään näillä ohjeilla osaa tuota saada toimimaan.. Mitä muuta on tehtävä kuin tuo kyseinen koodinpätkä? Huom olen todella aloittelija näissä hommissa..

Teuro [22.10.2019 14:27:19]

#

jojojojo kirjoitti:

Kiitos. En kuitenkaan vieläkään pelkästään näillä ohjeilla osaa tuota saada toimimaan.. Mitä muuta on tehtävä kuin tuo kyseinen koodinpätkä? Huom olen todella aloittelija näissä hommissa..

Sinun pitää liittää ohjelman alkuun vielä sopiva import-lause, jolla kyseinen paketti tulee ohjelmalle näkyväksi.

import java.text.DecimalFormat;

jojojojo [22.10.2019 14:50:54]

#

Kiitos tuostakin uudesta vinkistä. Tämä tehtävä vaatii kuitenkin, että desimaaleissa käytetään pilkun sijasta pistettä, eikä hyväksy tätä ratkaisua.. Mikä tässä tilanteessa ratkaisuksi?

Metabolix [22.10.2019 16:13:00]

#

Grezin ratkaisu on tosielämässä oikea ratkaisu luvun muotoiluun. Koulutehtävän tyypillinen ratkaisu olisi joko tulostus metodilla System.out.format formaatilla %.3f, jolloin esimerkissä tulee viimeiseksi desimaaliksi nolla, tai kotikutoinen ”pyöristys” kolmen desimaalin tarkkuuteen seuraavalla kaavalla:

tulos = Math.round(1000 * tulos) / 1000;

Grez [22.10.2019 17:44:01]

#

Sinänsä "jännää" että järjestelmässä, jossa tehtävät ilmeisesti tarkistetaan, käytetään localena suomea (tai muuta jossa pilkku on desimaalierotin), mutta ei sitten kuitenkaan hyväksytä pilkkua desimaalierottimeksi.

Metabolixin ehdottamat ratkaisut on toimivia, tai sitten voi pistää DecimalFormatin käyttämään pistettä desimaalierottimena:

DecimalFormatSymbols symbols = new DecimalFormatSymbols();
symbols.setDecimalSeparator('.');
DecimalFormat df = new DecimalFormat("#.###", symbols);

Lisäys:

Sinänsähän tuon tehtävän varmasti saisi helpoiten ratkaistua "hyväksytysti" muuttamalla vaan alkuperäisestä koodista rivin:

ympyrän_ala = 3.142 * ympyrän_säde * ympyrän_säde;

Muotoon:

ympyrän_ala = ympyrän_säde * ympyrän_säde * 3.142;

Melkein veikkaan että tämä pyöristyshaaste on ikään kuin puskista tullut ylimääräinen juttu, eikä ole oikeasti edes tarkoitettu tehtävän osaksi.

jojojojo [24.10.2019 12:09:46]

#

Suuri kiitos kaikille avusta. Tuo viimeinen yksinkertainen piin arvon heittäminen tuohon loppuun tosiaan sai ohjelman toimimaan tehtävän edellyttämällä tavalla. Mutta minkä takia asia ratkeaa vain tuota paikkaa vaihtamalla?

Grez [24.10.2019 16:24:27]

#

Johtuu laskujärjestyksestä. Jos lasketaan ensin kokonaislukujen tulo, niin mahdollinen liukulukulaskun pyöristysvirhe tulee vasta ihan viimeisessä kertolaskussa. Jos kerrotaan heti kokonaisluku ja liukuluku, niin tulee kaksi liukulukulaskua, joissa kummassakin voi tulla pyöristysvirheitä.

3.142 * 45 = 141.39 (liukuluku)
141.39 * 45 = 6362.549999999999

45 * 45 = 2025 (kokonaisluku)
2025 * 3.142 = 6362.55

Toki pyöristysvirhe voi tulla joka tapauksessa, esim.
77 * 77 * 3.142 = 18628.917999999998


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta