Avatar billede mikkelbm Nybegynder
15. maj 2007 - 09:56 Der er 28 kommentarer og
3 løsninger

Under double opførsel

Hej

Jeg har 2 forskellige projekter hvor jeg mener jeg gør nøjagtig det samme:

Projekt 1:
double doublePrice1 = 0.19;
doublePrice *= 10.0;
Resultat: 1.9 // som forventet

Projekt 2:
double doublePrice1 = 0.19;
doublePrice *= 10.0;
Resultat: 1.8999999761581421 // Ikke forventet

Nogen der kan forklare grunden til disse forskelle? Og hvad jeg eventuelt kan gøre ved det?
Avatar billede mikkelbm Nybegynder
15. maj 2007 - 09:57 #1
Projekt 1 er et lille testprojekt.

Projekt 2 er en del af en større applikation.
Avatar billede ladyhawke Novice
15. maj 2007 - 10:10 #2
det afhænger af hvad din doubleprice variabel er (mon doublePrice1 og doublePrice skulle være det samme) og hvordan du vælger at formattere/udskrive resultat... (du skriver heller ikke hvilke type resultat er i de to tilfælde (om det er double)
Avatar billede bubbaa Nybegynder
15. maj 2007 - 10:12 #3
Er både doubleprice og resultat defineret som double i begge projekter?
Avatar billede mikkelbm Nybegynder
15. maj 2007 - 10:15 #4
Projekt 1:
double doublePrice1 = 0.19;
doublePrice1 *= 10.0;
Resultat: 1.9 // som forventet

Projekt 2:
double doublePrice1 = 0.19;
doublePrice1 *= 10.0;
Resultat: 1.8999999761581421 // Ikke forventet

Det er samme variabel. Det er det der gør det underligt.
Avatar billede mikkelbm Nybegynder
15. maj 2007 - 10:16 #5
Hvordan det udskrives har ikke noget at sige. Og resultatet er doublePrice1.
Avatar billede ladyhawke Novice
15. maj 2007 - 10:17 #6
hvordan finder du ud af hvad resultatet er? i hvert tilfælde
Avatar billede mikkelbm Nybegynder
15. maj 2007 - 10:19 #7
:) Som sagt har det ingen indflydelse på det, men hvis du absolut vil vide så:

- Trace.WriteLine (doublePrice1);
- textbox.Text = doublePrice1.ToString();
- Gemt i databasen uden konvertering
- Debugger (QuickWatch)

Alle med samme resultat.
Avatar billede arne_v Ekspert
15. maj 2007 - 10:52 #8
er du 112% sikker paa at den "forkerte" koden ikke bruger 0.19f og 10.0f ?
Avatar billede arne_v Ekspert
15. maj 2007 - 10:52 #9
f betyder floar konstant og ikke double konstant og giver praecis det "forkerte" resultat
Avatar billede arne_v Ekspert
15. maj 2007 - 10:52 #10
float konstant
Avatar billede crazysnap Seniormester
15. maj 2007 - 10:53 #11
Hej mikkelbm,

Hvis du skriver præcis det her i begge projekter:


double doublePrice1 = 0.19;
doublePrice1 *= 10.0;
Console.WriteLine(doublePrice1);


Udskriver den da 1.9 i det lille projekt og 1.8999999761581421 i det andet?


Det er meget vigtigt at 0.19 og 10.0 sættes som de gør i begge projekter og du ikke får dem et andet sted fra (som f.eks. en database) i et af projekterne. Hvis du indsætter de 3 linjer ovenover i begge projekter burde den udskrive 1.9 i consolen begge steder. :)


Mvh.

- Snap
Avatar billede arne_v Ekspert
15. maj 2007 - 10:53 #12
men ioevrigt boer du bruge decimal til priser !!!!!!!!!
Avatar billede crazysnap Seniormester
15. maj 2007 - 10:54 #13
Hov og det er med den forudsætning at du kører det på samme hardware (samme computer)
:)

Mvh.

- Snap
Avatar billede mh6000 Nybegynder
15. maj 2007 - 10:55 #14
Avatar billede crazysnap Seniormester
15. maj 2007 - 11:01 #15
Samt at de begge skal køre i samme mode, altså begge i debug mode eller begge i release mode. :)
Avatar billede mikkelbm Nybegynder
15. maj 2007 - 11:17 #16
arne_v
15/05-2007 10:52:03
Jeg har prøvet at køre koden som jeg skrev i spørgsmålet, så det er jeg temmelig sikker på, ja.

crazysnap
15/05-2007 10:53:22
Jeg har prøvet at hardcode de samme værdier i begge projekter, og resultatet er det samme.

arne_v
15/05-2007 10:53:24
Værdierne skal senere skrives til hardware, så der bliver de kortet af alligevel.

crazysnap
15/05-2007 10:54:28
Samme maskine for begge projekter.
Avatar billede mikkelbm Nybegynder
15. maj 2007 - 11:19 #17
crazysnap
15/05-2007 11:01:06

I det lille testprojekt kører jeg bare testprojektet.

I det andet starter jeg vores hoved-applikation og debugger derigennem.
Avatar billede mikkelbm Nybegynder
15. maj 2007 - 11:19 #18
Men begge kører i debug-mode.
Avatar billede mikkelbm Nybegynder
15. maj 2007 - 11:33 #19
Bare lige for at I kan se, at jeg ikke er helt tosset, har jeg taget nogle screenshots af scenariet, hvor man ser quick-watch værdien af den omregnede double:

Billede fra mit test-projekt:
http://www.tallyflex.com/test_project.png

Billede fra vores store projekt:
http://www.tallyflex.com/real_project.png
Avatar billede mikkelbm Nybegynder
15. maj 2007 - 11:39 #20
Og som Arne også påpeger ville jeg forvente dette kunne ske ved en float, men jeg vidste ikke det kunne ske ved en double.
Avatar billede arne_v Ekspert
15. maj 2007 - 12:09 #21
Jeg kan ikke genskabe:

C:\>type z.cs
using System;

namespace E
{
        public class MainClass
        {
                public static void Main(string[] args)
                {
                        double x = 0.19;
                        x *= 10.0;
                        Console.WriteLine(x);
                        double y = 0.19f;
                        y *= 10.0f;
                        Console.WriteLine(y);
                }
        }
}


C:\>csc z.cs
Microsoft (R) Visual C# .NET Compiler version 7.10.6001.4
for Microsoft (R) .NET Framework version 1.1.4322
Copyright (C) Microsoft Corporation 2001-2002. All rights reserved.


C:\>z
1.9
1.89999997615814

C:\>csc /o+ z.cs
Microsoft (R) Visual C# .NET Compiler version 7.10.6001.4
for Microsoft (R) .NET Framework version 1.1.4322
Copyright (C) Microsoft Corporation 2001-2002. All rights reserved.


C:\>z
1.9
1.89999997615814
Avatar billede arne_v Ekspert
15. maj 2007 - 12:11 #22
det rigtige projekt er vel ikke noget der compiles til .NET CF ?
Avatar billede bitmatic Nybegynder
15. maj 2007 - 12:33 #23
Er værdierne ens hvis du kigger på dem råt. (altså i hex i et memory view)
Avatar billede mikkelbm Nybegynder
15. maj 2007 - 12:36 #24
arne_v
15/05-2007 12:11:14

De compiles begge med .NET 2.0 almindelig compiler.
Avatar billede mikkelbm Nybegynder
15. maj 2007 - 12:46 #25
Test projekt:

66-66-66-66-66-66-FE-3F

Det store projekt:
00-00-00-60-66-66-FE-3F


Fundet ved at gøre følgende:
double test = 0.19;
test *= 10.0;
string hex = BitConverter.ToString (BitConverter.GetBytes (test));
Avatar billede crazysnap Seniormester
15. maj 2007 - 13:31 #26
Hej mikkelbm,


Har du checket at optimization i projekt properties er sat ens for begge projekter? F.eks. kunne "Optimize code" være checked for det ene projekt men ikke for det andet? Eller måske er der sat nogen andre build egenskaber op som ikke stemmer overens mellem de to projekter?

Mvh.

- Snap
Avatar billede mikkelbm Nybegynder
18. maj 2007 - 13:00 #27
crazysnap

Det er samme indstillinger for begge projekter.

Noget tyder på at det er en ting vi må leve med, så løsningen blev at afrunde beløbet umiddelbart inden det blev skrevet til hardware.

Så hvis Arne, Crazysnap og mh6000 smider et svar...
Avatar billede mh6000 Nybegynder
18. maj 2007 - 13:19 #28
Svar :-)
Avatar billede crazysnap Seniormester
18. maj 2007 - 13:44 #29
Så kommer der da også et herfra! :)
Avatar billede arne_v Ekspert
18. maj 2007 - 14:58 #30
.
Avatar billede arne_v Ekspert
20. maj 2007 - 05:57 #31
hvis du kigger på koden via ILDASM ser den så ens eller forskellig ud ?
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