/*------------------------------------------------------*/
/* SUMBEVARENDE AFRUNDING */
/* */
/* Programmet demonstrerer addition med sumbevarende */
/* afrunding. Man kan selv vælge antallet af decimaler */
/* hvormed de afrundede resultater trykkes. For hvert */
/* nyt tal beregnes den afrundede værdi efter */
/* 5-reglen og efter sumbevaringsreglen. De beregnede */
/* størrelser lagres i lokale variable, og deres */
/* værdier kan hentes af det omgivende program vha. */
/* fire selektorfunktioner. */
/* */
/* H.B.Hansen, februar 1998, revideret juni 1999 */
/*------------------------------------------------------*/
public class Sumbevar
{
//Lokale arbejdsvariable.
private double forrigeSum = 0;
private double nySum = 0; //Partiel sumbevarede sum
private double realSum = 0; //Partiel uafrundet sum
private double x; //Aktuelt indtastet tal
private double diff; //Aktuelt sumbevaret tal
/*----------------------------------------*/
/* SELEKTORER */
/* */
/* De fire følgende funktioner returnerer */
/* resultatet af beregningerne i procedu- */
/* ren makeSums. */
/*----------------------------------------*/
public double sumbevSum()
{ return nySum; }
public double femregelSum()
{ return realSum; }
public double tastetTal()
{ return x; }
public double sumbevTal()
{ return diff; }
/*------------------------------------------------*/
/* INITIALISERING */
/* */
/* Denne procedure skal kaldes hver gang man vil */
/* udføre en ny beregning. */
/*------------------------------------------------*/
public void initialize()
{
forrigeSum = 0;
nySum = 0;
realSum = 0;
}
/*---------------------------------------------------*/
/* AFRUNDING EFTER 5-REGLEN */
/* */
/* x afrundes efter 5-reglen p den (dec+1)'te */
/* decimal. */
/*---------------------------------------------------*/
private double round(double x,int dec)
{
int tipot = 1;
for (int i = 1; i <= dec; i++) tipot *= 10;
return Math.floor(x*tipot + 0.5)/tipot;
}
/*---------------------------------------------------*/
/* SELVE BEREGNINGSALGORITMEN */
/* */
/* Parameteren s er det sidste indtastede tal som en */
/* String. Der udføres summation efter 5-reglen og */
/* med sumbevarende afrunding, afrundet til dec */
/* decimaler. */
/*---------------------------------------------------*/
public void makeSums(String s, int dec)
{
Double tal = new Double(s); //Skab et double-objekt
x = tal.doubleValue(); //Find dets værdi
realSum += x; //Adder værdien til uafrundet sum
nySum = round(realSum,dec); //Afrund til dec decimaler
diff = nySum - forrigeSum; //Find tabeltilvæksten
forrigeSum = nySum; //Forbered for næste s
}
}
Dette var altså selve algoritmen
til sumbevarende afrunding. Det kan være, du er interesseret i at
se det drivprogram, jeg benytter i min demo. Den kan du få at se
ved at klikke her.