webForumDet fria alternativet

1.057 blir till 1.0569999999999999 i VB .Net???

.NET

28 svar · 1 095 visningar · startad av lilja

Medlem sedan juli 20041 183 inlägg
Frågan#1

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 idé om hur jag kan ändra så att 1.057 blir 1.057 istället för 1.0569999999999999??

Medlem sedan juli 20041 183 inlägg
#2

Bifogar ett kodexempel!

    Private Sub cmdBeraknaNyLon_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdBeraknaNyLon.Click
        Dim intGammalLon, intNyLon As Integer

        intGammalLon = Convert.ToInt32(txtGammalLon.Text)

        If intGammalLon < 1.0569999999999999 Then
            intNyLon = intGammalLon * 1.0569999999999999
        Else
            intNyLon = intGammalLon * 1.02
        End If

        lblNyLon.Text = "Din nya lön blir" & intNyLon.ToString("0.00")
    End Sub
Medlem sedan nov. 2003569 inlägg
#3

prova att använda float istället

Medlem sedan aug. 20039 340 inlägg
#4

Hur irriterande det än är med att koden ändras så är 1.056999 med oändligt många nior och 1.0567 samma tal, rent matematiskt.

Medlem sedan juli 20041 183 inlägg
#5

inte när man går mot oändligheten!

Medlem sedan juli 20041 183 inlägg
#6

float som variabel?

Medlem sedan aug. 20039 340 inlägg
#7

Pröva detta:

Dim intGammalLon As Double, intNyLon As Double

Och, jo, jag har för mig att det gäller även när man går mot oändligheten.

Medlem sedan juli 20041 183 inlägg
#8

det är när jag skriver in ett konstant tal som det blir så...

ex:

intGammalLon * 1.057

görs om till

intGammalLon * 1.0569999999999999

i programkoden

Medlem sedan maj 20021 466 inlägg
#9

Flyttal är nästan aldrig exakta. Därför ska man tänka på två saker när man använder dem. Jämförelser ska göras inom ett intervall. Formatering ska göras med ett visst antal decimaler.

Exempel - nära noll:
Nära noll: > -0.1 && < 0.1

Exempel - PI med två decimaler:
string.Format("Tal: {0:F2}", Math.PI);

Medlem sedan juli 20041 183 inlägg
#10

Vad har det med min fråga att göra??????

på samma sätt som

if
     kod...
end if

ändras till:

If
     kod...
End If

... alltså på samma sätt som vissa små bokstäver blir stora blir 0.5 till 0.499999999 för mig i koden! INTE i någon label eller liknande utan i programkoden! VARFÖR???

Medlem sedan aug. 20039 340 inlägg
#11

Jag skrev ett svar här. Hur funkade det? Pröva och berätta sen om det funkade!

Medlem sedan juni 20019 024 inlägg
#12

lilja skrev:

VARFÖR???

För att ditt program tycker om många decimaler.

Titta bland inställningarna och se vad som kan vara fel.

Medlem sedan maj 20018 027 inlägg
#13

lilja skrev:

Vad har det med min fråga att göra??????

Marcus E:s svar har allt med din fråga att göra. Mycket förenklat kan man konstatera att det hänger ihop med problemet att lagra decimala tal i det binära systemet, där även decimalerna är binära. Vissa tal låter sig helt enkelt inte översättas rakt av till binära tal. Frågan är alltså hur den binära representationen av 1.057 egentligen ser ut. Just det talet kanske inte kan representeras exakt i det binära talsystemet. Då kan det bli så.

Medlem sedan maj 20021 466 inlägg
#14

Om du skriver 0.5 kommer det inte att ändras till 0.499... i din kod. Däremot kan det visas som 0.499... på alla de platser där talet visas. För att istället visa det med ett fast antal decimaler (t.ex. 0.5) kan man göra som jag skrev i mitt tidigare inlägg.

Att if blir If är en helt annan sak som handlar om att VB inte skiljer mellan små och stora bokstäver och föredrar att det står If istället för if.

Medlem sedan juli 20041 183 inlägg
#15

Ja men det är bara i skolan i vissa datasalar som som detta händer... Testade nyss i hemmet och här händer det inte...

Så vad är det för inställning man ska ändra på för att 1.057 ska förbli 1.057 iställer för att ändras till 1.0569999999... Jag hittar den inte :(

Medlem sedan maj 20021 466 inlägg
#16

Läs mitt inlägg en gång till. http://www.webforum.nu/showthread.php?s=&postid=956963#post956963
Fråga gärna om det är något du inte förstår i det.

Flyttal kan inte alltid representeras som exakta tal. För att visa dem på skärmen (formatera) dem som exakta tal måste man ange hur många decimaler som ska visas.
1.057 och 1.05699... är exakt samma tal. Det är bara två olika sätt att visa dem. Bestämmer du att ett visst antal decimaler ska användas kommer niorna att avrundas uppåt så att du slipper se dem.

Medlem sedan juli 20041 183 inlägg
#17

snälla förstå mig!

Jag förstår att man måste formatera resultatet för att få t.ex. två decimaler på skärmen... Detta är INTE problemet!

Mitt problem är att i PROGRAMKODEN står det t.ex:

variabel = 15 * 1.056999999999999999

när jag i själva verket skrivit in:

variabel = 15 * 1.7

Jag har INGET problem med utskriften... Det är enbart i PROGRAMKODEN! Så jag tänkte att om man vill multiplicera riktigt stora tal så kommer det att bli skillnad i svaret...

Det är som sagt bara i ett klassrum i skolan som detta sker? I mitt hem består 1.057 (och andra tal!) så som jag skriver in dem i PROGRAMKODEN!

Jag tänkte att det måste vara en inställning också men vad är det för oinställning!

Igen, PROGRAMKODEN! Inte utskriften i programkörningen utan i programkoden!

Medlem sedan feb. 20013 023 inlägg
#18

@lilja:
Men för bövelen har du testat med Nitros kod? DOUBLE !!!!!
Du sitter ju multiplicerar integers med decimaltal=Helt fel

nitro2k01 skrev:

Pröva detta:

Dim intGammalLon As Double, intNyLon As Double
Medlem sedan juli 20041 183 inlägg
#19

men det var då... DET KVITTAR!

Jag kan lika väl skriva såhär:

Om jag i koden skriver

variabel = 17,5 *1.057

så ändras det till

variabel = 17,4999999999999 *1.05699999999999999

**Min fråga var varför Visual Studio .Net ändrar min kod så att det står ANDRA tal än vad jag skrev dit!

OBS! Detta sker enbart i skolans datorer och måste därför vara en inställning? Eller? OBS!**

Medlem sedan nov. 2003569 inlägg
#20
intGammalLon = Convert.ToInt32(txtGammalLon.Text)

Det är här problemet ligger. en int variabel kan inte hantera decimaler därför kommer den kapa bort dem, du måste använda en variabel som kan hantera decimaler. och riktigt många helst, såsom en riktig feting "float" eller "double".

gör om alla variabler till float eller double så ska du se att det ordnar sig.

double test = double.Parse("1,006868768600");

267 ms totalt · 4 externa anrop · v20260731065814-full.6fe65c25
124 ms — deklarationer (db)
0 ms — hämta statistik (cache)
139 ms — hämta tråd, inlägg och bilagor (db)
123 ms — ändringar (db)