Ich hatte es bereits befürchtet, aber nun hat es sich auch bestätigt, du hast Kosten im Gleitkomma-Format gespeichert. Anstatt dass jeder Preis eine Ganzzahl ist, die du nur für die Anzeige durch 100 teilst, hast du Preise auf 2 Nachkommastellen angegeben, welche "nicht genau" sind. EIGENTLICH sollte float eine Genauigkeit von 7-8 Stellen haben und bei 2 Nachkommastellen sollte alles ok sein, aber gerade hatte ich zwei! Fehler.
Weizen ist angegeben mit 2,62 Gold. Mein Vermögen betrug noch 4,75 Gold. Nach Abzug eines Weizens sollte ich also 2,13 Gold haben. Es sind aber nur noch 2,12 Gold. Der Gleitkommafehler vom Weizen hat zusammen mit dem Gleitkommafehler von meinem Besitz einen Cent gekillt. Wie gesagt, du wirst mich für diesen Vorschlag hassen, aber du solltest "mal kurz" nachgucken, wie aufwändig es ist alle Preise und den Goldbesitz in Ganzzahl zu speichern und nur in der Anzeige eine Kommazahl zu verwenden. Meiner Erfahrung nach kann eine solche Umstellung Tage dauern, entsprechend musst du dir überlegen, wann und ob du dir das antuen möchtest.
Eine weitere Sache: Man kann das Schicken zum Markt MÖGLICHERWEISE verarschen.
Offensichtlich kostet 100.000.000 Einheiten diagonal zu verschicken 1.414.213,56 Gold. Also "Wurzel 2" für 100 Einheiten. Das Verschicken von 10.000.000 Einheiten kostet 141.421,35 Gold. Offensichtlich wurde die letzte angezeigte Stelle nicht korrekt gerundet. Das bedeutet jetzt plötzlich, dass ich sparen kann! 10 Einheiten kosten 0,14 Gold. 1 Einheit kostet 0,01 Gold. Wenn ich also 10x 1 Einheit verschicke, sollte mich das 0,10 Gold statt 0,14 Gold kosten. Ich habe also 28,6% Verschickungskosten gespart! Nun, auch da ist ein Rundingsfehler drin. Denn nachdem ich mit meinen "falschen" 2,12 Gold nun 10 mal 1 Einheit verschickt habe, habe ich noch 2,01 Gold übrig. Ich habe also 0,11 Gold für 10 Einheiten ausgegeben. Auch gut. Verstehe zwar nicht, warum ich 2 mal einem Rundungsfehler aufgesessen bin, aber das sind eben Gleitkomma-Zahlen, sie sind scheiße! Wie auch immer du den Preis für die Kosten anzeigen lässt, mach ein Math.ceil() davor. 1 Einheit kostet dann 0,02 Gold 10 Einheiten kosten 0,15 Gold 100 Einheiten kosten 1,42 Gold usw. je mehr man verschickt, desto "billiger" wird es, einfach weil es genauer wird. Und verwende den angezeigten Preis, und nicht irgendeinen Hintergrundpreis, der für die Anzeige zurecht gerundet werden muss... Statt a = wurzel(2) * Einheiten / 100; Anzeige: Math.round(a, 2); Gold -= a; (mit Gleitkommazahlen und falscher Stelle von round) unbedingt folgendes verwenden: a = Math.round(wurzel(2) * Einheiten); Anzeige: a/100; Gold -= a; (mit Ganzzahlen und richtiger Stelle von round) Statt Math.round solltest du wie gesagt Math.ceil verwenden um Sparen zu verhindern.
Nachtrag: Rundungen am Markt: Aufgrund meines unglaublichen Reichtumes wollte ich nun die 10 Waren am Markt verkaufen. Naja, ich habe noch mal 20 als Stapel dazu geschickt, also 30 ^^
Für meine Kartoffeln wird nun angezeigt: Warenpreis: 5,06 Gold pro Pfund Verkaufspreis: 0,00 Gold (bzw. 4,65, Bemerkung siehe unten) Händerprovision: (dynamisch) Gesamterlös: (dynamisch)
So, Kommentar 1: Du wolltest das Feld mit 0 initialisieren statt leer, damit der Verkaufspreis angezeigt wird. Kommentar 2: Ich finde es korrekt, dass 4,65535 Gold Verkaufspreis zu 4,65 abgerundet werden. Kommentar 3: Ich finde es fair, dass der Händler die 8% auf den Gesamtverkaufspreis rechnet und nicht die Differenz zum Verkaufspreis mal 30. ABER: Hier wird mit Bruchcents gerechnet, wo ich denke, dass die Börse zwar toll ist, aber man muss es nicht übertreiben, oder?
ZAHLEN: Menge: 30 Warenpreis: 5,06 Verkaufspreis: 4,65 Händlerprovision: 12,15 Gesamterlös: 139,77 EIGENTLICH: Händlerprovision = (5,06-4,65) * 30 = 12,30 Gold wie gesagt, auf Gesamtverkaufspreis ist fair! Aber wofür dann der Einzelpreis, wenn er doch nicht verwendet wird? Welche Information gewinne ich aus etwas, das nicht benutzt wird? "Gesamtverkaufspreis" ist also Händlerprovision + Gesamterlös = 12,15 + 139,77 = 151,92 => 1 Pfund Kartoffeln ist 5,064 Gold wert statt 5,06. Wieso wird dann 5,06 Gold angegeben? Ja, cool, ich bekomme 139,77 Gold statt 139,65 (5,06*30 - 12,15), also 12 Cent mehr. Das ist toll, aber... WARUM? JA, die Börse ist toll mit "Nachcentstellen" und sollte auch so bleiben, aber für einen Verkauf würde ich den Spieler über den Tisch ziehen. 5,069999999 wird auf 5,06 runtergerundet. Alles wird runtergerundet. Von den echten 5,06*30 wird dann die Händlerprovision berechnet. 151,8 - 8% = 139,656 Gold werden zu 139,65 Gold abgerundet für den Spieler und - tada - 12,15 für den Händler. Und das ganz ohne 0,004 Centnachkommastelle ^^
Ja. Die anderen 2 Waren (man kann sie im Hintergrund erahnen) zeigen bei Wert und Preis das gleiche an. Und da die Versandkosten 0,01414bla betragen, müsste sich diese 0,01 also auch bei den anderen Produkten bemerkbar machen.
ARGS! Wenn ich das gerade richtig gesehen habe, dann habe ich gerade 2 Leute dazu beauftragt 14 Feuerholz zu produzieren. Für den Auftrag wurden mir laut Anzeige neben der Minimap 4,89 Gold und 14 Holz abgezogen. 4,89 Gold ist in meiner Mathewelt nicht durch 14 teilbar... 489 auch nicht...
----------------------------------------------
Jetzt wird es aber langsam wild. Die Anzeige neben der Minikarte zeigte 13,12 Gold für 15 Weizenfelder. Eigentlich hätten es 13,05 sein sollen... Ich schreibe mir beim nächsten Mal genau auf, was oben in der Ecke steht, und versuche durch PrintScreen das Ding neben der MiniMap zu erwischen.
f5t147p718n52.png - Bild entfernt (keine Rechte)(Sorry, ich musste Bytes sparen)
OK, was sehen wir hier? 1. Rundungsfehler bereits beim Anbau, und zwar von 0,005 Gold pro Feld! 2. ich hatte exakt 3301,00 Gold - 39,37 Gold ergibt 3261,62 Gold. Öhm, was? JA! Der der halbe Goldcent hat auch hier zugeschlagen... NARF.
es kann sein das bei einigen Ansichten falsch gerundet wird. Die Stellen nach dem Komma werden einfach weggelassen. Ich werde da mal mehr drauf achten, dass exakt gerechnet wird. Ein Stück Feuerholz kostet 0,35. Wenn du das mal 14 nimmst sind es laut Javascript 4.8999999999999995. Da wurde dann ab der dritten Stelle anscheint abgeschnitten. Warum Javascript hier so komisch rechnet weiß ich nicht. Aber mit korrekter Rundung wurde 4.9 raus kommen.
Ich finde es interessant, wie du nach diesen Rundungsfehlern jagst. Und möchte gleichzeitig meinen Respekt aussprechen, weil ich darauf nie geachtet habe und womöglich auch nie darauf gekommen wäre, was du hier darlegst. Gute Arbeit, weiter so!
Zitat von CHRUPP Ich finde es interessant, wie du nach diesen Rundungsfehlern jagst. Und möchte gleichzeitig meinen Respekt aussprechen, weil ich darauf nie geachtet habe und womöglich auch nie darauf gekommen wäre, was du hier darlegst. Gute Arbeit, weiter so!
So soll es sein, jeder achtet auf unterschiedliche Dinge und so findet man die unterschiedlichsten Fehler, bekommt zeitgleich aber auch die unterschiedlichsten Ideen wie man das Spiel noch verändern/ergänzen kann. Mir persönlich würden solche Fehler nie auffallen, da ich selbst nicht ganz so genau auf mein Gold achte.
Hier der neuste Beitrag, ohne Kommentar:f5t147p745n57.png - Bild entfernt (keine Rechte)
Weitere News: Weizenanbau kostet scheinbar 2,625 Gold. Weizenabbau kostet definitiv 0,875 Gold. Das ergibt zusammen wunderschöne 3/4 + 1/4 = 4/4, aber... Nein... So bitte nicht! 350 ist nicht durch 4 teilbar, wie es scheint.
Ich sagte doch... Investiere 3 Tage, mache aus jeder Gleitkommazahl eine Ganzzahl (bei Ganzzahl / Ganzzahl wird bei den vielen Sprachen sogar wieder eine Ganzzahl produziert durch abgerundet).
Bin dafür, die ganzen "Cent"-Beträge abzuschaffen und auf ganze "Euros" aufzurunden. Sofern notwendig müssen die Preise alle erhöht werden.. dafür ändert sich aber auch das Startgold etc. Grund: dann spart man sich die ganze Rechnerei mit den Kommazahlen und es wird für Spieler sowie Programmierer einfacher, die Preise nachzuvollziehen.
Weizen anbauen: 2 Gold pro Feld Holz abbauen: 10 Gold pro Feld Gemüse anpflanzen: 5 Gold pro Feld etc.
Nur um weitere aufzuführen: Wildfleisch wird auch für 2,27 "produziert", sind aber 2,275 im Endpreis. Und bei ungerader Produktion wird natürlich die 0,005 hinten im Gesamtpreis wieder bgeschnitten (aber nicht abgerundet).