webForumDet fria alternativet

programmerings problem

20 svar · 2 751 visningar · startad av david760

david760Medlem sedan sep. 20101 inlägg
#1

Hej jag ska skriva ett prgram sm med hjälp av typomvandling omvandlar ett inmatat decimaltal till närmaste hel tal. exempel 34.5 avrundar till 35

Så här långt har jag kommit

:

public class uppgift3_3 {
     public static void main(String[] args) {
          char tecken = 97;
          System.out.println("tecken = " + tecken);
          System.out.print("Mata in ett nytt tecken: ");
          tecken = Keyboard.readChar();
          System.out.println("tecken = " + tecken);
     }
}
GunnarDMedlem sedan juni 20014 290 inlägg
#2

En liten hjälp på vägen:

* läs in ett flyttal till en variabel (ex. tal)
* Antingen använd språkets inbyggda avrundningsfunktion (kan heta round någontin) eller addera talet med 0,5 och gör sedan om det till ett heltal.

Btw: om man följer reglerna så borde 34,5 avrundas till 34 inte 35 (iallafall dom regler jag lärt mig någon gång på forntiden :) )

CompusaMedlem sedan jan. 20023 327 inlägg
#3

GunnarD skrev:

Btw: om man följer reglerna så borde 34,5 avrundas till 34 inte 35 (iallafall dom regler jag lärt mig någon gång på forntiden :) )

Jag har lärt mig tvärtom, vilket enligt min vetskap är det mest vedertagna. Avrundar man 34,5 till heltal så blir resultatet 35. Däremot så avrunda 34,49 till 34.

Avrunda rätt:
http://www.matteguiden.se/matte-a/grunder/tal-i-decimalform/#Avrunda-rtt

@ndersMedlem sedan juni 200032 969 inlägg
#4

Om man nu ska gå in på matematisk teori har både GunnarD och Compusa rätt - det beror på vilken avrundningsmetod man förespråkar. GunnarD har lärt sig Bankers' rounding, och det är den metod jag brukar använda också.

http://en.wikipedia.org/wiki/Rounding#Round_half_to_even

Men det var bara en liten parentes. :)

onkelborgMedlem sedan juli 2003555 inlägg
#5

Det är iofs den ganska stor parantes, den har lärts ut i Sverige någon gång för länge sedan, men det som lärs ut nuförtiden, och nog får anses korrekt, är att alltid avrunda uppåt om det är 50/50

nidronMedlem sedan jan. 2005257 inlägg
#6

GunnarD skrev:

En liten hjälp på vägen:

* läs in ett flyttal till en variabel (ex. tal)
* Antingen använd språkets inbyggda avrundningsfunktion (kan heta round någontin) [...]

Jupp, Math.round() borde vara användbart :)

@ndersMedlem sedan juni 200032 969 inlägg
#7

Well. Om man programmerar i .NET kan man prova att konvertera 34.5 resp 35.5 till heltal så får man se vad som händer. Menar onkelborg att talfunktionerna i .NET gör fel?

GunnarDMedlem sedan juni 20014 290 inlägg
#8

onkelborg skrev:

men det som lärs ut nuförtiden, och nog får anses korrekt, är att alltid avrunda uppåt om det är 50/50

När man i framtiden tar bort 50öringen och bara räknar med kronor, så kommer konsumenterna att förlora om man alltid höjer .5 till jämn krona, om man däremot avrundar till närmsta jämna krona så kommer det att gå jämt upp med tiden.

I det läget föredrar jag nog det sättet jag lärt mig :)

onkelborgMedlem sedan juli 2003555 inlägg
#9

@nders skrev:

Well. Om man programmerar i .NET kan man prova att konvertera 34.5 resp 35.5 till heltal så får man se vad som händer. Menar onkelborg att talfunktionerna i .NET gör fel?

Hm, om jag ska vara ärlig så har jag inte hört talas om att det här sättet att avrunda på fortfarande användas innan jag hade läst den här tråden. Har precis gjort lite empiriska studier och vid snabb anblick konstaterat att .NET avrundar som nämnts, men javascript avrundar alltid uppåt vid 50/50. Måste undersökas mer :)

onkelborgMedlem sedan juli 2003555 inlägg
#10

Har tittat lite mer på det hela, hittade följande tråd som är intressant: http://stackoverflow.com/questions/977796/in-c-math-round2-5-result-is-2-instead-of-3-are-you-kidding-me

[edit]Mer exakt: http://stackoverflow.com/questions/977796/in-c-math-round2-5-result-is-2-instead-of-3-are-you-kidding-me/1606252#1606252 [/edit]

C/C++, Java, Perl och Javascript verkar bete sig som de ska, .NET har den lite udda buggen (eftersom att .NET följer en IEEE-standard.. Ibland är inte standarder av godo, men det går att komma runt med en overload.)

Hur som haver, det blir nog till att skriva en extensionmethod till i biblioteket :)

matlinMedlem sedan okt. 2006224 inlägg
#11

onkelborg: Är det en bugg om det är per design? :)

Jag gillade Skeets svar: "In particular, history has shown that it's not the expected behaviour - and in most cases that's a cardinal sin in API design."

onkelborgMedlem sedan juli 2003555 inlägg
#12

Det är en bugg ur alla användares och programmerares ögon, även fast det är en "feature". Ungefär som att .NET Framework, till skillnad mot alla andra bibliotek och mjukvaror, bara körde med max två samtidigt anslutningar mot en webbserver pga. att det stod så i en spec :)

(Jepp, jag är lite hård, t.ex. kallade jag lite av Tele2:s mjukvara för virus för ett tag sedan..)

matlinMedlem sedan okt. 2006224 inlägg
#13

Hade vi använt din definition av buggar i vårt företag hade vi inte kunna ta betalt för många förändringar ("buggar") våra kunder ber om eftersom det oftast är per design. Men jag förstår absolut din ståndpunkt! En produkt ska inte fungera efter en standard/specifikation utan det förväntade beteendet hos användarna.

onkelborgMedlem sedan juli 2003555 inlägg
#14

Nja, snarare så att bara för att man byter utvecklingsmiljö så ska inte sådana simpla saker som avrundning börja fungera på ett annat sätt. Det klassar jag nog som en bugg. (Sen att det är per design, och dessutom följer en rekommendation i en standard är en annan sak..) Utöver standarden så är det som används överallt annars avrundning uppåt vid 50/50, om man bortser ifrån att avrunda till jämnt har lärts ut en gång i tiden när man inte visst bättre ;) Någonstans borde någon tänkt till lite i designprocessen..

(Så vitt jag förstår så är det alltså ett designval i .NET Framework, inte i t.ex. C#. C# i sig säger ingenting om hur en avrundning ska ske.)

(I fallet med antal anslutningar mot en webbserver så ser jag att jag formulerade mig klumpigt, och tänkte fel. Jag backar på den. Det är ok, det är trots allt ganska högnivå, även om det är lite störande.)

invecklarenMedlem sedan jan. 2008280 inlägg
#15

GunnarD skrev:

När man i framtiden tar bort 50öringen och bara räknar med kronor, så kommer konsumenterna att förlora om man alltid höjer .5 till jämn krona,

I det läget föredrar jag nog det sättet jag lärt mig :)

Är det verkligen så?

Om vi tänker oss att vi har talen
34.0
34,1
34,2
34,3
34,4
-------------
34,5
34,6
34,7
34,8
34,9

så kommer de fem första att avrundas till 34 och de fem sista att avrundas till 35. Sålunda lika många avrundningar uppåt som nedåt, vilket borde ge en jämn fördelning av "felen" ?

nidronMedlem sedan jan. 2005257 inlägg
#16

Fast 34.0 behöver ju inte avrundas, det är ju redan ett heltal :)

Jag tillhör nog de yngre som fått lära sig att 0,5 avrundas uppåt. Under tioöringarnas utdöende tid lärde jag mig att >= 0,25 blir 0,50 och >= 0,75 blir 1. Dock tycker jag att avrundning nedåt/uppåt beroende på jämn/ojämn siffra var väldigt spännande :)

GunnarDMedlem sedan juni 20014 290 inlägg
#17

invecklaren skrev:

Är det verkligen så?

Om vi tänker oss att vi har talen
34.0
34,1
34,2
34,3
34,4
-------------
34,5
34,6
34,7
34,8
34,9

så kommer de fem första att avrundas till 34 och de fem sista att avrundas till 35. Sålunda lika många avrundningar uppåt som nedåt, vilket borde ge en jämn fördelning av "felen" ?

Eftersom du har 34.0 med så skall du ha 35.0 med, annars blir inte medel 34.5 och det blir obalans.

34.0
34.1
34.2
34.3
34.4
---------
34.5
---------
34.6
34.7
34.8
34.9
35.0

Nu har du 5 tal på varje sida och om man då alltid höjer 34.5 så kommer 5 av 11 avrundas till 34 och 6 av 11 avrundas till 35 vilket ger en obalans men om man avrundar .5 till närmsta jämna så blir balans över tiden. (ju fler avrundingar desto bättre balans blir det)

Mr TMedlem sedan maj 20071 061 inlägg
#18

Var inte det just av-rundningen som det gick så mycket "hacker" myter om. Hackers som lyckats stoppa in en liten kod snutt i en bankernas datasystem. Var gång det skulle betalas ut en summa som avrundades så hamnade mellanskillnaden på hackerns konto. Många transaktioner senare blev det en rejäl slant på kontot. Myt eller verklighet, men bra "saga" är det.

En JÄTTE parantes i sammanhanget.

aronMedlem sedan mars 2004485 inlägg
#19

Mr T skrev:

Var inte det just av-rundningen som det gick så mycket "hacker" myter om. Hackers som lyckats stoppa in en liten kod snutt i en bankernas datasystem. Var gång det skulle betalas ut en summa som avrundades så hamnade mellanskillnaden på hackerns konto. Många transaktioner senare blev det en rejäl slant på kontot. Myt eller verklighet, men bra "saga" är det.

Verklighet, är ett program hot av typen Trap Door. Flera programmerare har blivit arresterade för detta brått. Man har ofta inte gömmt den felaktiga avrundningen i koden utan i kompilatorn vilket gör det svårt att upptäcka.

Sen finns det en film där några noobs gör det och dom råkar göra fel så dom får för mycket pengar.

SRY för OT

dAEkMedlem sedan feb. 20041 816 inlägg
#20

Mr T skrev:

Var inte det just av-rundningen som det gick så mycket "hacker" myter om. Hackers som lyckats stoppa in en liten kod snutt i en bankernas datasystem. Var gång det skulle betalas ut en summa som avrundades så hamnade mellanskillnaden på hackerns konto. Många transaktioner senare blev det en rejäl slant på kontot. Myt eller verklighet, men bra "saga" är det.

Office Space! :D

133 ms totalt · 3 externa anrop · v20260731065814-full.2b84b982
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
130 ms — hämta tråd, inlägg och bilagor (db)