Avatar billede dragnor Juniormester
06. oktober 2008 - 19:31 Der er 9 kommentarer og
1 løsning

er der decimaler i en double

Hej eksperter

Er der en simpel måde at teste om der er decimaler i en double?
Avatar billede arne_v Ekspert
06. oktober 2008 - 19:44 #1
Ikke nogen universel sand maade.

if(x - (int)x < 0.0000001)

eller lignende vil i nogle tilfaelde kunne bruges.
Avatar billede driis Nybegynder
06. oktober 2008 - 19:45 #2
Ja, f.eks.:
d - Math.Floor(d) > 0

Hvor d er din double. Pga. præcisionen af double kan det være at du er interesseret i at anvende en anden threshold værdi end 0, alt afhængig af hvor store tal du arbejder med og hvor præcist du arbejder.
Avatar billede arne_v Ekspert
06. oktober 2008 - 19:46 #3
Problemet er at double ikke er decimalt baseret men binaert baseret. Og derfor
er det lidt arbitraet hvornaar man vil sige at der er en decimal eller ej.

Brug typen decimal hvis du vil have bedre styr paa decimaler.
Avatar billede aaberg Nybegynder
06. oktober 2008 - 20:03 #4
Man kan vel bare gøre sådan:

bool harDecimaler = myDouble % 1 > 0;
Avatar billede dragnor Juniormester
06. oktober 2008 - 20:27 #5
Tak for de mange bud. Jeg kom selv på en løsning, hvor jeg konvertere den til en string og siger double.indexof(',') > 0
Avatar billede dragnor Juniormester
06. oktober 2008 - 20:28 #6
altså double er i ovenstående en string.
Avatar billede arne_v Ekspert
06. oktober 2008 - 21:03 #7
Det er faktisk ikke en daarlig loesning fordi konverteringen til string haandterer
noget af floating point problemet.

Proev for sjovs skyld at koere denne her:

using System;

namespace E
{
    public class Program
    {
        private const double EPS = 0.0000001;
        private static bool ZeroOrOne(double x)
        {
            return (x < EPS ) || (x > 1 - EPS);
        }
        public static void Test(double x)
        {
            Console.WriteLine("{0,3} {1,-5} {2,-5} {3,-5} {4,-5} {5,-5} {6,-5} {7,-5}", x,
                              x - (int)x == 0,
                              x - Math.Floor(x) == 0,
                              x % 1 == 0,
                              x.ToString().IndexOfAny(",.".ToCharArray()) < 0,
                              ZeroOrOne(x - (int)x),
                              ZeroOrOne(x - Math.Floor(x)),
                              ZeroOrOne(x % 1));
        }
        public static void Main(string[] args)
        {
            for(int i = 0; i < 100; i++)
            {
                Test(Math.Sqrt(i) * Math.Sqrt(i));
            }
            Console.ReadKey();
        }
    }
}
Avatar billede dragnor Juniormester
07. oktober 2008 - 14:05 #8
hehe...ikke dårligt!

men jeg håber det er ok jeg trækker mine point igen , når jeg selv fandt en simpel løsning?
Avatar billede aaberg Nybegynder
07. oktober 2008 - 14:24 #9
Lige en note. Du kan godt komme i problemer, ved bare at søge efter et komma. Hvis en computer er indstillet så den tror den er i USA, så vil du få fejl, da de der bruger punktum.

Hvis du bruger løsningen at først konvertere til en streng, hvor du derefter søger strengen igennem for at finde decimal tegnet. Da bør i det mindste søge efter et punktum, i tillæg til et komma.

Jeg har oplevet et lignende problem, da et program pludselig holdt op med at virke hos en kunde. Det viste sig at være et lignende problem. Et andet program kunden havde købt, gik automatisk ind og ændrede region-opsætningen, så den gik efter Amerikansk standard. Hvis vi manuelt gik ind og ændrede det tilbage, virket dette andet programmet ikke. Og så længe den stod på Amerikansk opsætning, virkede vores program ikke på computeren.
Lidt pinligt for os. Det var heldigvis ikke mig der havde skrevet programmet :-).
Avatar billede dragnor Juniormester
07. oktober 2008 - 15:32 #10
tak for påmindelsen, jeg skulle dog ikke bruge løsningen til et firma, men til mig selv, i forbindelse med automatisk generering af matematikopgaver til nogle skoleelever :-)
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
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

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