webForumDet fria alternativet

1.057 blir till 1.0569999999999999 i VB .Net???

.NET

28 svar · 1 095 visningar · startad av lilja · sida 2 av 2

Frågan, av lilja

Hej alla! Varför är det så att en del decimaltal ändras när man skriver in dem?? I mitt fall ville jag öka en variabels värde med 5,7%. Men så fort jag skrivit in 1.057 och låtit Visual Studio .Net kontrollera raden så blir värdet istället 5,69999999999999%?? Varför blir det såhär? Finns det en anledning till att det ska vara så eller är det bara jag som har problem med Visual Studio .Net? Någon

Läs frågan i sin helhet →
Medlem sedan juli 20041 183 inlägg
#21

det har inget med variabler att göra!

det är i programkoden det händer!

Om jag vill multiplicera ett tal med ett annat ändrar ibland Visual Studio .Net på min kod!

Om jag skrev in ex. 1.057 så står det 1.056999999999 efter att Visual Studio .Net har validerat koden!

Har inget med variabler eller programkörning att göra! Det är i koden det är problem!

Medlem sedan nov. 2003569 inlägg
#22

Inte vara syra. Gör nu detta pöjk:

double test=double.Parse("17,5")*double.Parse("1,057");

label2.Text=test.ToString();

:bire

Medlem sedan apr. 2004778 inlägg
#23

Eftersom Visual Studio i vissa fall validerar som skit så kanske du skulle stänga av formatteringen.
Felet ligger alltså i inställningarna i Visual Studio i det klassrum där felet är.
Vad de övriga grabbarna här försöker göra är att ge dig en lösning så att det inte spelar någon roll vad VS gör.

Medlem sedan maj 20021 466 inlägg
#24

Jag har nu testat din kod och du har rätt. VS .NET ändrar de flyttal man skriver in. :l

Jag tycker att ett IDE ska ändra så lite som möjligt i den kod man skriver in och göra ändringar endast vid begäran. Du kan stänga av detta (Options->Text Editor->Basic->VB Specific->Pretty listing) men då ändras inte längre if till If. Fast det är nog lika bra.

Att flyttalen bara ändras på vissa datorer beror på att du har olika processorer som inte representerar flyttal på samma sätt.

Exemplet som Nöff gav ska undvikas så mycket som möjligt. Parse ska aldrig användas i onödan eftersom den fungerar olika med olika kulturer.

Medlem sedan juli 20041 183 inlägg
#25

ok, tackar som förstod min fråga och som fick mig att förstå... Det var den frågan jag ville ha svar på...

så det beror alltså på processorerna? det var som attan :)

Medlem sedan nov. 2003569 inlägg
#26

Exemplet som Nöff gav ska undvikas så mycket som möjligt. Parse ska aldrig användas i onödan eftersom den fungerar olika med olika kulturer.

Hur menar du då om man får fråga?. Om man tex har ett decimal-tal i en textbox, hur ska man då få den till en double?.

Medlem sedan maj 20018 027 inlägg
#27

Nöff skrev:

Exemplet som Nöff gav ska undvikas så mycket som möjligt. Parse ska aldrig användas i onödan eftersom den fungerar olika med olika kulturer.

Hur menar du då om man får fråga?. Om man tex har ett decimal-tal i en textbox, hur ska man då få den till en double?.

Han menar nog just ditt specifika exempel, där du ger en sträng direkt i källkoden, som ska parsas. I fallet med textboxar, spelar kulturen ingen roll, eftersom en svensk alltid skriver decimaltalen med decimalkomma, och en amerikan alltid använder decimalpunkt. Men står strängen direkt i källkoden, då är det ett decimalkomma som står där, även om programmet körs i USA. Och då blir strängen misstolkad.

Medlem sedan nov. 2003569 inlägg
#28

Så att ett program som använder "double test=double.Parse("1,009");" och är skrivet i sverige kommer inte att fungera i tex USA?.

Medlem sedan maj 20021 466 inlägg
#29

Det kommer att fungera på alla datorer som har komma inställt som decimaltecken i de regionala inställningarna (kultur). I många länder används punkt istället. Där fungerar det inte. Format och Parse använder användarens kultur men du kan själv välja den kultur som ska användas genom att skicka med den som ett argument.

244 ms totalt · 4 externa anrop · v20260731065814-full.1dc6f849
120 ms — deklarationer (db)
0 ms — hämta statistik (cache)
122 ms — hämta tråd, inlägg och bilagor (db)
120 ms — ändringar (db)