2016-07-13 37 views
0

Dies ist ein Programm zur Berechnung von Tipps. Ich brauche StundenArray [], um jede Zelle normal zu runden (Math.round() ist der beste Weg zu meinem Wissen). Das Problem ist, dass ich immer noch das unrounded hoursArray [] in totalHours [] speichern muss.Probleme beim Runden von Zellen in einem Array, während immer noch eine nicht gerundete Kopie davon angezeigt wird

Beispiel der gewünschten Ausgabe: Bob arbeitet 33,49 Stunden und Sara arbeitet 33,5 Stunden, die Spitzen für die Woche sind Stunden sollten bis 33 abrunden $ 200.00

So Bobs und Saras bis 34. aufrunden würde würden Sie in der Lage sein, den Unterschied in den Trinkgeldern zu sehen, wenn Sara mehr hat als Bob. Aber die Gesamtstunden für die Woche würden immer noch als 66,99 angezeigt werden.

Gerade jetzt dieses Programm ist alles andere es soll tun, ich kann einfach nicht herausfinden, wie jede Zelle von hoursArray abzurunden [] und halten immer noch die totalHours [] intakt.

Wie kann ich jede Zelle in hoursArray [] runden und die nicht gerundeten Werte weiterhin in totalHours [] speichern? Benutze ich einen Klon() von StundenArray? arrayCopy()? Ich bin fest ...

Der Problembereich markiert ist, und zwischen Linien 33 und 43. Math.floor() ist notwendig, weil ich das Programm brauche, um die Spitzen nach unten zu runden.

import java.util.Arrays; 
import java.util.Scanner; 

class Tips_Calculation2 
{ 
public static void main(String[] args) 
{ 
    Scanner scan = new Scanner(System.in); 
    float totalTips = 0; 
    float totalHours = 0; 

    System.out.print("How many employees worked for the week?: "); 
    int numberOfEmps = scan.nextInt(); 


    System.out.println("\nEnter the names of all " + numberOfEmps + " employees"); 


    String[] namesArray = new String[numberOfEmps]; 
    for(int i = 0; i < numberOfEmps; i++) 
    { 
     namesArray[i] = scan.next(); 
    } 


    System.out.println("\nEnter the amount of hours each person worked for the week: "); 






//////////////////////////////////////////////////////**THIS IS WHERE IM STUCK**/////////////// 
    int counter = 0; 
    float[] hoursArray = new float[namesArray.length]; 
    for(int n = 0; n < namesArray.length; n++) 
    { 
     System.out.print(namesArray[n] + ": "); 
     hoursArray[n] = scan.nextFloat(); 
     totalHours = totalHours + hoursArray[n]; 
     counter++; 
    } 
////////////////////////////////////////////////////////////////////////////////// 






    System.out.println("\nTotal hours: " + totalHours); 
    System.out.print("\nEnter the amount of money to be distributed as tips: $"); 
    totalTips = scan.nextFloat(); 
    System.out.println("---- OUTPUT ----"); 
    System.out.println(); 


    int x = 0; 
    for(int a = 0; a < namesArray.length; a++) 
    { 
     System.out.println(namesArray[a] + ": " + "$" + Math.floor(((hoursArray[x]/totalHours) * totalTips))); 
     x++;           
     System.out.println(); 
    } 
} 
} 
+0

floor() wird immer auf die nächstkleinere Zahl abgerundet, die kleiner als Ihre Eingabe ist. Wenn Werte wie 33.5 auf 34 runden sollen, müssen Sie round() verwenden. Dein Problem ist in der Berechnung. Ich nehme an, du meinst so etwas: Math.round (StundenArray [x])/totalHours * totalTips. Dein Array totalHours ist davon nicht betroffen, solange du den gerundeten Wert nicht im angegebenen Array "cell" speicherst. – Supahupe

+0

Ich muss den Math.floor() behalten, da er Tipps nach unten runden muss, habe ich dies in meiner Frage bearbeitet zukünftige Zuschauer. Danke für deinen Beitrag. –

+0

Dann können Sie wie folgt vorgehen: Math.round (StundenArray [x])/totalHours * Math.floor (totalTips). Dies wird die Stunden am angegebenen Array-Index abrunden oder erhöhen, hat keinen Einfluss auf Ihre totalHours, die auf dem korrekten Wert bleiben und Ihren totalTip abrunden. – Supahupe

Antwort

1

Der Teil, den Sie markiert haben sieht ok: hoursArray wird in der Tat die (nicht gerundet) Anzahl der Stunden, enthalten jeweils eine gearbeitet hat.

Ihr Problem ist später, wenn Sie die Rundung machen. Aus Ihrer Beschreibung verstehe ich, dass Sie die Anzahl der Stunden runden möchten, nicht das resultierende Trinkgeld. Daher muss eine Berechnung, wie etwas sein:

Math.round(hoursArray[x]) * totalTips/totalHours 

Auch wenn Sie die Gesamtzahl der Stunden zu berechnen, Sie die gerundet Anzahl der Stunden hinzufügen möchten, sonst wird Ihre Tipps werden nicht auf die gewünschte aufsummieren gesamt:

totalHours = totalHours + Math.round(hoursArray[n]); 
1

Wie bereits auf Ihre Frage in den Kommentaren gesagt, können Sie die Spitze jeder Person berechnen kann, und um sie herum „nach unten“ durch diese Aufforderung mit:

Math.floor(Math.round(hoursArray[x])/totalHours * totalTips); 

Math.round(hoursArray[x]) wird rund um die Stunden (33,3 bis 33, 33,7 bis 34). Math.floor() wird dann die berechnete individuelle Spitze abrunden (333,3 bis 333, 333,7 bis 333).

+0

diese Methode immer noch .0 am Ende jedes Ergebnisses. Ich versuche es am Ende jedes Ergebnisses zu erreichen, wo ich keine .0s habe. Wie 30.918 würde 30 werden, 5.555 würde 5 usw. –

+0

Dann können Sie Typ Casting verwenden: (int) Math.floor ((int) (Math.round (StundenArray [x])/totalHours * totalTips)); – Supahupe