Är det någon som vet varför just 0,165 avrundas till 0,16 och inte 0,17 i asp/vbscript eller har en lösning på det? Det är ju inga problem med t.ex. 0,175. Hur vill du att tal på formen xxx.xx5 skall avrundas - uppåt, nedåt, slumpmässigt, beroende på om andra decimalen är udda eller jämn, eller enligt någon annan konstig regel? Jag vill avrunda x antal decimaler till två decimaler, t.ex. 0,165 med bara två decimaler ska ju avrundas till 0,17. Men nedanstående vbscript avrundar ju både uppåt/nerdåt och till en decimal: <b>Jag vill avrunda x antal decimaler till två decimaler, t.ex. 0,165 med bara två decimaler ska ju avrundas till 0,17.</b> Det finns 5 vanliga sätt att avrunda tal som slutar på 5. Tack för svaren! Jag vill avrunda till närmast högre med två decimaler, 0,005 ska bli 0,01 osv. Men varför avrundas t.ex. 0,015 till 0,02 med Round medan 0,115 avrundas till 0,11? Problemet är iofs att jag i ett skript summerar och summan blir 0,165 samtidigt som jag på förhand vet att värdet ska bli 0,165. Jag avrundar båda med Round(x.xxx,2) och får 0,17 respektive 0,16. Det bör ju inte vara slumpen som styr hur asp/vbscript ska avrunda. Du du uppfattar som 0,115 kanske egentligen är 0,11499999, vilket ligger närmare 0,11 än 0,12. >Men varför avrundas t.ex. 0,015 till 0,02 med Round medan 0,115 avrundas till 0,11? Tack för alla tips och svar! >Med CCur blir det fortfarande "fel". Med CCur blir det "avrunda-mot-jämnt-regeln": Jag fick den här koden förut, den kanske går att göra kortare. Det är nog den konstigaste kod jag sett. Platsar säkert på http://thedailywtf.com/Mycket konstig avrundning
<code>Round(0.165,2)</code>Sv: Mycket konstig avrundning
Sv:Mycket konstig avrundning
<code>
a = 0.005
For i = 1 to 20
a = a + 0.01
b = b & a & " = " & Round(a,2) & vbCrLf
Next
WScript.Echo b
</code>
Ska inte Round(a,2) avrunda till just två decimaler?Sv: Mycket konstig avrundning
Det är lika korrekt att avrunda 0,165 till 0,16 som till 0,17.Sv: Mycket konstig avrundning
1. Närmast högre
2. Närmast lägre
3. Från 0
4. Mot 0
5. Till närmaste jämna
Round & CInt använder metod 5.
Int använder metod 2
Fix använder metod 4
Vilken är det du vill ha?Sv:Mycket konstig avrundning
Sv: Mycket konstig avrundning
Sv: Mycket konstig avrundning
Det beror på att du använder datatypen double vilket inte är en exakt datatyp (till skillnad från t.ex. Currency och int).
Ett klassiskt exempel är talet 0,1. Det är förståss exakt i det vanliga talsystemet (bas 10) men är inte exakt i det talsystem double använder (bas 2). Om du tar 1/7 så får du ett tal som inte är exakt i bas 10 (det blir 0,142857...). 0,1 blir liknande i bas 2.
Kort sagt: 0,115 är antagligen inte exakt i en double utan är kanske 0,1149999... vilket avrundas korrekt till 0,11.
Om du behöver exakta värden bör du se till använda datatypen Currency istället för Double (eller alternativt Int med skalning).
Prova detta
a = CCur(0.005)
For i = 1 to 20
a = a + 0.01
b = b & a & " = " & Round(a,2) & vbCrLf
Next
WScript.Echo b
>Jag vill avrunda till närmast högre med två decimaler
x = Fix(x * 100+0.5)/100
(Tänk dock på att -0,015 avrundas till -0,01 vilket är närmast högre)Sv:Mycket konstig avrundning
Med CCur blir det fortfarande "fel". Om jag däremot använder FormatNumber blir det som jag vill:
<code>
a = 0.005
For i = 1 to 20
a = a + 0.01
b = b & a & " = " & FormatNumber(a,2,-1,0,-1) & vbCrLf
Next
WScript.Echo b
</code>Sv: Mycket konstig avrundning
Avrundningen blir rätt för mig. Vilket värde blir fel?
>Om jag däremot använder FormatNumber blir det som jag vill:
Jo men det förändrar ju inte värdet utan bara utskriften.Sv:Mycket konstig avrundning
0,025 blir 0,02 men bör bli 0,03
0,045 blir 0,04 men bör bli 0,05
0,065 blir 0,06 men bör bli 0,07
0,085 blir 0,08 men bör bli 0,09Sv: Mycket konstig avrundning
<info>
<%
vValue = 234.75
vOre = Mid(Cstr(vValue),InStr(Cstr(vValue),","),3)
vTal = Left(Cstr(vValue),(InStr(Cstr(vValue),",")-1))
If vOre =< 0.24 Then
vAdd = 0
cValue = FormatCurrency(vValue)
cUtj = FormatCurrency(vTal - vValue)
cTal = FormatCurrency(vTal)
ElseIf vOre > 0.24 And vOre < 0.75 Then
vAdd = 0.5
vTal = vTal + vAdd
cValue = FormatCurrency(vValue)
cUtj = FormatCurrency(vTal - vValue)
cTal = FormatCurrency(vTal)
ElseIf vOre => 0.75 Then
vAdd = 1
vTal = vTal + vAdd
cValue = FormatCurrency(vValue)
cUtj = FormatCurrency(vTal - vValue)
cTal = FormatCurrency(vTal)
End If
Response.Write("
Initialt tal : " & vValue & "
")
Response.Write("Utjämning : " & cUtj & "
")
Response.Write("Resultat : " & vTal & "
")
%>
</info>Sv:Mycket konstig avrundning
Om jag förstår rätt så är meningen att den skall avrunda till närmaste 50 öring. (0.25 och 0,75 avrundas uppåt).
>den kanske går att göra kortare.
avrundat = Int(vValue*2+0.5)/2
Response.Write("Initialt tal : " & FormatCurrency(vValue))
Response.Write("Utjämning : " & FormatCurrency(avrundat - vValue))
Response.Write("Resultat : " & FormatCurrency(avrundat))