/ Forside / Teknologi / Udvikling / Java / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Java
#NavnPoint
molokyle 3688
Klaudi 855
strarup 740
Forvirret 660
gøgeungen 500
Teil 373
Stouenberg 360
vnc 360
pmbruun 341
10  mccracken 320
Afrunding af Float
Fra : Puk


Dato : 16-05-01 06:49

Hej alle sammen

Kan nogen hjælpe mig med at få afrundet en float eller en Float?
Lad os blot sige at man ønsker at gange to floats med hinanden og
få resultatet som en float med kun 1 decimal.
Kan dette gøres på en lidt smartere måde end ved at bruge wrapper
klassen Float, gange resultatet med hundrede, bruge Math-klassens
metode til at runde af til int og så herefter dividere med 10 til
en float? Det er jo en noget omstændig metode blot for at ende
med et decimaltal med kun 1 decimal.

På forhånd tak for al hjælp.

Tusinde hilsner
Puk



 
 
Jonas Kongslund (16-05-2001)
Kommentar
Fra : Jonas Kongslund


Dato : 16-05-01 08:05

Puk wrote:
> Kan nogen hjælpe mig med at få afrundet en float eller en Float?
> Lad os blot sige at man ønsker at gange to floats med hinanden og
> få resultatet som en float med kun 1 decimal.

Se på java.text.DecimalFormat

--
Jonas Kongslund, http://kongslund.dk

Puk (16-05-2001)
Kommentar
Fra : Puk


Dato : 16-05-01 17:54

"Jonas Kongslund" <jonas@dev.null <mailto:jonas@dev.null>> wrote
in message
<news:3B02269A.9770816A@dev.null>...

> Puk wrote:
> > Kan nogen hjælpe mig med at få afrundet en float eller en
Float?
> > Lad os blot sige at man ønsker at gange to floats med
hinanden og
> > få resultatet som en float med kun 1 decimal.
>
> Se på java.text.DecimalFormat

Det har jeg gjort, men den runder jo ikke ordentligt af for mig.
Den
formatterer blot. Men tak for dit forslag.
Jeg har kigget lidt mere på det selv og er endt med at bruge
java.math.BigDecimal. Se mit meget lille eksempel, hvis du er
nysgerrig:

import java.math.BigDecimal;

public class testFloat {
public static void main(String args[]) {
System.out.println("Here we go..");
Float f = new Float(45.9875978484843);
BigDecimal bd = new BigDecimal(f.toString()); // bd får værdien
45.9876
BigDecimal res = bd.setScale(1,BigDecimal.ROUND_HALF_UP); // a
får
værdien 46.0
System.out.println("res = "+res);
}
}

Tusinde hilsner
Puk

>
> --
> Jonas Kongslund, http://kongslund.dk



Jonas Kongslund (16-05-2001)
Kommentar
Fra : Jonas Kongslund


Dato : 16-05-01 18:51

Puk wrote:
> Det har jeg gjort, men den runder jo ikke ordentligt af for mig.
> Den formatterer blot.

Jeg er en smule forvirret. Hvad er det du vil opnå?

1) Et afrundet tal du kan udskrive med een decimal, og i givet fald.
hvilken afrundingsregel skal gælde?
2) En /talrepræsentation/ som kun kan håndtere een decimal?
3) Andet?

--
Jonas Kongslund, http://kongslund.dk

Puk (17-05-2001)
Kommentar
Fra : Puk


Dato : 17-05-01 06:23

"Jonas Kongslund" <jonas@dev.null> skrev i en meddelelse
news:3B02BDFF.E69E416A@dev.null...


> Jeg er en smule forvirret. Hvad er det du vil opnå?
>
> 1) Et afrundet tal du kan udskrive med een decimal, og i givet
fald.
> hvilken afrundingsregel skal gælde?

Det er lige det. I nogle tilfælde skal jeg bruge den
konventionelle afrundingsregel, den som de fleste af os lærer i
skolen. Men i andre tilfælde skal jeg bruge andre former for
afrunding. Derfor ville jeg gerne finde en klasse, som kunne
klare alle mulige former for afrundinger. Det så ud som om
java.math.BigDecimal var lavet til netop disse ting.


Tusinde hilsner
Puk



Jonas Kongslund (17-05-2001)
Kommentar
Fra : Jonas Kongslund


Dato : 17-05-01 20:06

Puk wrote:
> Det er lige det. I nogle tilfælde skal jeg bruge den
> konventionelle afrundingsregel, den som de fleste af os lærer i
> skolen.

Hertil kan DecimalFormat faktisk bruges.

float bar = 23905.26355474;
DecimalFormat foo = new DecimalFormat();
foo.setMaximumFractionDigits(1);
System.out.println( foo.format(bar) );

--
Jonas Kongslund, http://kongslund.dk

Kristoffer Sørensen (16-05-2001)
Kommentar
Fra : Kristoffer Sørensen


Dato : 16-05-01 08:42

Kan følgende ikke bruges:

float a = 0.43939;
float b = 0.9393;
float c = a*b;
float res = ((int)(c*10.0))/10.0;

Mvh
Kristoffer M. Sørensen
Kiloo

"Puk" <powder@worldonline.dk> wrote in message
news:jvoM6.12340$zv2.1668395@news010.worldonline.dk...
> Hej alle sammen
>
> Kan nogen hjælpe mig med at få afrundet en float eller en Float?
> Lad os blot sige at man ønsker at gange to floats med hinanden og
> få resultatet som en float med kun 1 decimal.
> Kan dette gøres på en lidt smartere måde end ved at bruge wrapper
> klassen Float, gange resultatet med hundrede, bruge Math-klassens
> metode til at runde af til int og så herefter dividere med 10 til
> en float? Det er jo en noget omstændig metode blot for at ende
> med et decimaltal med kun 1 decimal.
>
> På forhånd tak for al hjælp.
>
> Tusinde hilsner
> Puk
>
>



Thomas Jespersen (17-05-2001)
Kommentar
Fra : Thomas Jespersen


Dato : 17-05-01 08:09

"Puk" <powder@worldonline.dk> writes:

> Kan nogen hjælpe mig med at få afrundet en float eller en Float?
> Lad os blot sige at man ønsker at gange to floats med hinanden og
> få resultatet som en float med kun 1 decimal.

Det eneste en-cifrede decimaltal du kan skrive som binær tal er 0.5 så
din opgave er umulig med almindelige floats.

Du kan dog gøre det med BigDecimal klassen.

Bertel Lund Hansen (17-05-2001)
Kommentar
Fra : Bertel Lund Hansen


Dato : 17-05-01 09:38

Thomas Jespersen skrev:

>Det eneste en-cifrede decimaltal du kan skrive som binær tal er 0.5

Hm. Hvordan tror du så at alle de andre bliver skrevet?

>så din opgave er umulig med almindelige floats.

Slet ikke. Der er skam også postet en løsning som ganske vist
ikke dækker Puks behov.

--
Bertel
http://lundhansen.dk/bertel/   FIDUSO: http://fiduso.dk/

Thomas Jespersen (17-05-2001)
Kommentar
Fra : Thomas Jespersen


Dato : 17-05-01 12:37

Bertel Lund Hansen <nospamto@lundhansen.dk> writes:

> Thomas Jespersen skrev:
>
> >Det eneste en-cifrede decimaltal du kan skrive som binær tal er 0.5
>
> Hm. Hvordan tror du så at alle de andre bliver skrevet?

public class FloatTest {
public static void main(String[] args) {
   for (float i=0.0f; i<=1.0f; i+=0.1f)
    System.out.println(i);

}
}

sabretooth/f% java FloatTest
0.0
0.1
0.2
0.3
0.4
0.5
0.6
0.70000005
0.8000001
0.9000001

Nogle af tallene *lader* til at kunne repræsenteres i binær form, men
det skyldes at java laver en afrunding når den konverterer fra binær
form til decimal form inden udskrivningen. Den bedste måde at få en
decimal på mener jeg er BigDecimal eller at vente med afrundingen
indtil udskrivningen (java.text.DecimalFormat).

Eksempel. 0.1 ser ud til at passe, vi laver en manuel konvertering til
binær:

1-bit præcision:
0.1d = 0.0b (eller 0.1b, begge upræcise).

2-bit:
0.1d = 0.01b = 0.25d

3-bit:
0.1d = 0.001b= 0.125d

5-bit:
0.1d = 0.00011b = 0.09375d

Man kan komme vilkårlig tæt på, men aldrig ramme.

Bertel Lund Hansen (17-05-2001)
Kommentar
Fra : Bertel Lund Hansen


Dato : 17-05-01 12:48

Thomas Jespersen skrev:

>Man kan komme vilkårlig tæt på, men aldrig ramme.

Hvad med 0,00390625?

Jeg ved godt hvordan decimaltal opbevares og skrives i en
computer. Der er et hav af decimaltal der kan skrives helt
præcist, og der er et hav hvor man kan komme temmelig (men ikke
vilkårligt) tæt på.

Du fik det til at se ud som om 1/2 var det eneste decimaltal man
kunne benytte i et program.

--
Bertel
http://lundhansen.dk/bertel/   FIDUSO: http://fiduso.dk/

Puk (17-05-2001)
Kommentar
Fra : Puk


Dato : 17-05-01 15:34

"Thomas Jespersen" <thomas@daimi.au.dk> skrev i en meddelelse
news:y4nk83gh2pa.fsf@sabretooth.daimi.au.dk...

> Du kan dog gøre det med BigDecimal klassen.

Hvilket er præcis hvad jeg er endt med at gøre *S*. Jeg anede
bare ikke, at den eksisterede, før jeg gav mig til at lede lidt
mere intenst. Tak for hjælpen

Tusinde hilsner
Puk



Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408929
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste