Välkommen till linuxportalen.se!

Linuxportalen.se är Sveriges största och aktivaste webbplats för användare av öppen- och fri programvara.

Du besöker Linuxportalen.se som gäst vilket begränsar din möjlighet att använda webbplatsens alla funktioner. Genom att registera dig som medlem får du inte bara möjlighet att söka bland webbplatsens innehåll, skapa nya och delta i befintliga diskussioner, skapa din egen blogg, kommunicera med andra medlemmar genom privata meddelanden och delta i omröstningar. Du får också tillgång till Veckans Kadavro - en seriestrip unikt skapad för Linuxportalen.se!

Registeringen sker snabbt och är helt kostnadsfri - tveka inte, bli medlem idag!

Avrundning uppåt

Alltså jag hyser inga större förhoppningar om att få hjälp med det här och blir galen snart på hur svårt det kan vara att nånstans på nätet hitta hjälp för hur man med en avrundning till närmsta heltal ska presentera ett procent-värde.

Har ingen kod att presentera, men problemet är enkelt. Svaret (för det måste väl gå att gå runt det på nåt sätt? ) har jag dock inte hittat!

Jag har ett antal testfall. Jag vill presentera vilka av dessa, i procent, som passerats. Det går så länge man avrundar neråt, men hur får man bash, med hjälp av kringliggande verktyg, att avrunda uppåt till närmsta heltal (ex: 47.9 % => 48 %)???

Alternativ för kommentarvisning

Välj ditt önskade sätt att visa kommentarerna och klicka på "Spara" för att verkställa dina ändringar.

lundatoks bild

ein.anderssons bild

lägg till 0.5 och ta sedan bort det efter punkten.
-
Jag är en spegel av den du tror jag är.

Denna text får användas enligt CCommons BY-ND 2.5 med undantag från att den inte får kopieras, sändas eller distribueras utan att informera mig

uffe_nordholms bild

Du bör ha en funktion som returnerar heltalsdelen av det tal du skickar. Beroende på vilket språk det gäller kan det heta olika, men int() och floor() är vanliga. Med dessa gör du såhär:

x=int(y+0.5);

I koden ovan antar jag att y är den variabel som skall avrundas till närmaste heltal (10.4 avrundas till 10 och 10,6 avrundas till 11)

Det kan finnas en annan funktion, ceil(), som avrundar till närmast högre heltal, och det anväder du i så fall

x=ceil(y-0.5)

rejass bild

Jag skulle använda printf som finns som standard nästan överallt.

Till exempel:

printf %.0f 47.95

eller i ett exempel:

#!/bin/bash

tal=47.7

avrundat=`printf %.0f $tal`

echo "Talet är $avrundat"

Som ser ut så här när man kör det:

rejas@akka~$ sh tmp/test.sh
Talet är 48

Använd "man printf" om inte dessa ledtrådar räcker, eller fråga igen.

/Marcus

nisses bild

Tack för era bidrag. Jag tror inte jag var tillräcklig tydlig dock. Poängen är den att jag ej på förhand vet om talet är av arten att det ska avrundas uppåt eller neråt. Det är ju en testsvit där värdet av passrate antagligen är olika från gång till gång. Behöver alltså kontrollera kvoten av passerade testfall och antalet testfall innan jag tar ett aktivt beslut att avrunda upp eller ner.

alberts bild

Det beror på vad du menar med kringprogram. Räknas perl som kringprogram? I så fall kan du använda perl för att avrunda, ungefär så här:

#!/bin/sh
VAL=3.52
perl -e 'printf("%d\n", $ARGV[0] + 0.5);' $VAL

Tilldela bara värdet av din beräkning till VAL så avrundar perlraden uppåt eller neråt.

uffe_nordholms bild

Antag att du vill avrunda 14,3 till något. Jag skulle välja att avrunda till 14, och det fixar tex

x=int(y+0.5);

Denna kodsnutt avrundar enligt följande:
- decimaltal med decimaldel mellan noll och 0,5 avrundas neråt till heltal
- decimaltal med decimaldel mellan 0,5 och närmast högre heltal avdrundas uppåt.

Om du vill ha avrundat på något annat sätt får du förklara närmare vad du vill åstadkomma.

rejass bild

Titta på mitt svar om printf igen. Jag tror det är precis vad du letar efter. Det rundar naturligtvis av vilket tal som helst korrekt.

nisses bild

Tack. printf löste problemet. Hittade ett exempel på man-sidorna. I ditt exempel fungerade det inte om "tal" var det okända resultatet av en aritmetisk beräkning. Fick därför kombinera din lösning med man-exemplet:

PASSRATE=`printf %.0f $(echo "scale=2;($PASSED_TESTCASES*100)/($TESTCASES_NUM)" | bc)`