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??
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
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);
... 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???
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å.
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.
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.
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!
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");
406 ms totalt · 4 externa anrop · v20260731065814-full.1dc6f849