Avatar billede riversen Nybegynder
13. maj 2002 - 18:27 Der er 16 kommentarer og
2 løsninger

regne med double

hvor udskriver

double d = 1253.1 * 3;
System.out.println( 3759.3 == d );
System.out.println( d );

3759.2999999999997

hvis jeg bruger

float f = (float)(1253.1 * 3);
System.out.println( 3759.3F == f );
System.out.println( f );

udskrives det rigtige

findes der en metode der kan afkorte til 2-decimaler på en double, eller skal jeg selv til at lave det?
Avatar billede =maddog= Nybegynder
13. maj 2002 - 18:39 #1
double of float bliver næsten altid "unøjagtige" under udregninger. du bør derfor ikke benytte == da samtlige bits skal være nøjagtig ens for at give true. evt. kan du lave en lille method
public boolean compare(double d1, double d2) {
double treshold = 0.000001; // grænsen for om de er ens
double diff = (d1>d2)?d1-d2:d2-d1; // forskellen som positivt tal
return (diff < treshold);
}
hvis du vil formatere en double kan du bruge et NumberFormat objekt.
Avatar billede riversen Nybegynder
13. maj 2002 - 18:53 #2
jeg undrer mig nu mest over resultatet i de første 3 linier...hvorfor det ikke giver 3759,3

== er blot nogle sammenligninger jeg lavede, for at finde ud af om det var i selve beregningen eller ved udskrivningen der skete en fejl.
Avatar billede carstenknudsen Nybegynder
13. maj 2002 - 19:27 #3
Fordi tallet 0.1, altså en tiendedel
ikke kan repræsenteres eksakt i binær
form med endeligt mange binære cifre.
Avatar billede riversen Nybegynder
13. maj 2002 - 19:32 #4
hvorfor er det så ikke noget problem med 999,1 ?

findes der ingen afrundingsmetoder?
Avatar billede carstenknudsen Nybegynder
13. maj 2002 - 19:47 #5
Det er det også. Jo, men de ligger i
BigDecimal klassen i java.math.
Avatar billede riversen Nybegynder
13. maj 2002 - 20:07 #6
Resultatet af 999,1 * 3 bliver udskrevet fint her, så ved ikke hvad du mener med "Det er det også".

Hvordan afrunder jeg til 2 decimaler?
Avatar billede carstenknudsen Nybegynder
13. maj 2002 - 20:10 #7
Beregn 999.1 *3 og læg det i en
variabel. Træk fra denne 2997.
Så skulle du have 0.3 ikke?
Men du har i virkeligheden
0.3000000000001819 det skrives
bare ikke rigtigt ud på skærmen
når det er 2997.3000000000001819
hvilket skyldes udskriftsrutinen
ikke tallet.
Du kan afrunde til to decimaler ved:
double x = ....;
double xMedToDecimaler = 0.01*((int)x*100);
Avatar billede carstenknudsen Nybegynder
13. maj 2002 - 20:15 #8
Du kan lave en metode som denne der
afrunder til n betydende cifre:
public static double afrund( double x, int n ) {
double pow = Math.pow(10,n);
return ((int)x*pow)/pow;
}
Avatar billede riversen Nybegynder
13. maj 2002 - 20:22 #9
det afrunder jo ikke korrekt...
Avatar billede carstenknudsen Nybegynder
13. maj 2002 - 20:23 #10
Kan du lige uddybe det, hvad afrunder
ikke korrekt og med hvilke argumenter?
Avatar billede riversen Nybegynder
13. maj 2002 - 20:32 #11
double x = 4684.4668464684;
double res = 0.01*( (int) (x * 100) );
System.out.println( res );

res bliver 4684.46
Avatar billede carstenknudsen Nybegynder
13. maj 2002 - 20:36 #12
Nå, nå, så prøver vi igen (jeg troede
at casting afrundede, men den trunkerede):
public static double afrund( double x, int n ) {       
double pow = Math.pow(10,n);           
return Math.round(x*pow)/pow;                                   
}
Avatar billede aslan Nybegynder
13. maj 2002 - 20:58 #13
import java.text.*;

class Decimal
{
    Decimal()
    {
        double tal = Math.random()*1000;

        DecimalFormat d = new DecimalFormat("0.##");

                System.out.println(tal);

        System.out.println(d.format(tal));
    }
    public static void main(String[] aslan)
    {
        new Decimal();
    }
}
Avatar billede carstenknudsen Nybegynder
13. maj 2002 - 21:10 #14
aslan: hvor er det der afrundes?
Udskrift til skærmen kan man jo
ikke arbejde videre med :)
Avatar billede aslan Nybegynder
13. maj 2002 - 21:43 #15
Det må riversen selv bygge videre på .. vi kan jo ikke give ham alt:)
Avatar billede disky Nybegynder
13. maj 2002 - 22:15 #16
riversen:
At det ikke nøjagtigt giver det du synes det skal give, skyldes at floating point tal ikke er 100% nøjagtigt, da det ville kræve et uendeligt antal bit.
Avatar billede riversen Nybegynder
13. maj 2002 - 22:40 #17
tak aslan...der var det...og så erstatter den endda . med ,

du skal også have tak for din flid carsten...

og du overlever nok uden point, disky ;-)
Avatar billede disky Nybegynder
13. maj 2002 - 22:47 #18
det kan du være helt sikker på :)

jeg har rigeligt i forvejen.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester