Hej! Ingen aning om varför det blir så... Men testa att gångra talet med 10 först: Ibland står det still, jag kör på det! Tackar för snabbt svar. Sen kan jag ju ägna min ålderdom åt att lista ut varför :) Skälet är helt enkelt att decimaltalen inte kan representeras exakt i datorn. jag är osäker på varför visual basic vill göra så här med decimaltal, prövar du tex att skriva ut 10.2-10 i debugen så returneras 0,19999999999 >jag är osäker på varför visual basic vill göra så här med decimaltal, prövar du tex att skriva ut 10.2-10 i debugen så returneras 0,19999999999 Prova med att använda Currency istället för DoubleSkilja tal med en decimal från tal med fler decimaler
Mysko det här. Jag behöver skilja ett värde med 1 decimal ifrån de som har fler än en.
Min lösning är den här:
Dim Tempo As Double
Tempo = 125.2
Tempo = Tempo - Fix(Tempo)
Resultatet jag får ut är 0.2000000003, antal nollar kanske ine exakt angivit men ungefär så här många.
Varför då då? Jag förväntade mig 0.2
Sv: Skilja tal med en decimal från tal med fler decimaler
Dim Tempo as Double
Tempo = 125.2 * 10
If Tempo = Fix(Tempo) Then ...
// MvH BjörnSv:Skilja tal med en decimal från tal med fler decimaler
/BoSv: Skilja tal med en decimal från tal med fler decimaler
Enklaste lösningnen torde vara att hålla reda på hur många decimaler det är, och sen avrunda till det.Sv: Skilja tal med en decimal från tal med fler decimaler
10.3-10 ger 0.3000000000001
det blir fel med de flesta decimaltal på det här sättet, dock inte när man tar ex 1.3-1
vad du däremot kan göra är att använda dig av vb's inbyggda funktion round, ex:
Tempo = 125.2
Tempo = Tempo - Fix(Tempo)
Text1.Text = Round(Tempo, 1)
ettan säger hur många decimaler du vill ha i svaretSv:Skilja tal med en decimal från tal med fler decimaler
Som Niklas sa så beror det på att inte alla decimaltal kan representeras exakt i datorn med den binära datatypen "double".
Det är samma fenomen som att 10/3 inte går att skriva exakt med decimal representations så 10/3 * 3 blir inte 10.
>det blir fel med de flesta decimaltal på det här sättet, dock inte när man tar ex 1.3-1
Ibland har man tur med avrundingen men det går inte att lita på.
Om man måste ha exakta decimala värden bör man använda en exakt datayp som t.ex. Integer eller Currency. Strängar med siffror eller BCD går också bra men det blir klurigare att göra beräkningar.
En annan lösningen på ursprungsproblemet är definiera hur stort fel som är tillåtet. Om man bara har tal som har färre än 4 decimaler kan man t.ex. använda 1e-6 som max fel.
if tempo*10 - int(tempo*10) > 1e-6*10 Then 'mer än en decimal
(blir lite krångligare om man har negativa tal)Sv: Skilja tal med en decimal från tal med fler decimaler