2Danke
ERLEDIGT
JA
JA
ANTWORTEN
4
4
ZUGRIFFE
562
562
EMPFEHLEN
-
23.10.11 03:36 #1
- Registriert seit
- Mar 2008
- Beiträge
- 59
Hallo,
mich hat jetzt ein kleines Problem wirklich Stundenlang beschäftigt. Ich wollte von einem Integer (in diesem Fall) 10% abziehen und diese dann zurückgeben. Das Ding ist bloß, ich möchte es nicht genau berechnen, sondern die Nachkommastellen sollen abgeschnitten werden von den errechneten 90%. Bei 162 müsste demnach 17(162 - (162*0,9) = 162 - 145[,8]), bei 160 16 (160 - 160*0,9) = 160 - 144) zurück geliefert werden:
Code :1 2 3 4 5 6 7
public int berechneStatusWesenDiffInit(float WesenInit) // Woanders über float x = 0.9F initialisiert { int Init = 160; int StatusWesen = (int)(Init * WesenInit); return (StatusWesen > Init) ? StatusWesen - Init : Init - StatusWesen; }
Für den wert 160 wurde jedoch immer 17 zurück geliefert, für 110 12 usw. Ich habe ewig nach den Fehler gesucht, bis ich alle floats mal durch double ersetzt habe. Von da an lief alles einwandfrei!
Code :1 2 3 4 5 6 7
public int berechneStatusWesenDiffInit(double WesenInit) // Woanders über double x = 0.9 initialisiert { int Init = 160; int StatusWesen = (int)(Init * WesenInit); return (StatusWesen > Init) ? StatusWesen - Init : Init - StatusWesen; }
Jetzt ist meine Frage: Warum? Was ist anders? Das einzige was mir einfallen würde, wäre, das als Ergebnis für StatusWesen nicht genau 144 raus kommt, sondern 143,999999... Das würde das Ergebnis erklären, da die Nachkommastellen ja bloß abgeschnitten werden. Jedoch hette ich gelesen, das Float bis zu 7 Nachkommastellen genau ist?Geändert von Spieleguru (23.10.11 um 03:43 Uhr)
-
Hi
Naja, 143.9999999 sind ja auch 7 Nachkommastellen...
Wenn man das Ganze im Binärsystem macht, merkt man, dass da fast immer was verloren geht.
Eine andere Lösung, die komplett auf Kommazahlen und ihre Ungenauigkeit verzichtet:
Code csharp:1 2 3 4 5 6 7 8 9
//zahl ist ein int if((zahl % 10) == 0) zahl /= 10; else { zahl /= 10; zahl++; }
GrußNetiquette (vA §15) und Nutzungsregeln (vA §4.8) einhalten! Programmcode in Codetags/Codeboxen.
Sehr gute Beiträge bitte Bewerten (Stern darunter oder "Danke").
"Funktioniert nicht" ist zu ungenau! Code, Fehlermeldungen, Verhalten des Programms, ...?
-
23.10.11 17:49 #3
- Registriert seit
- Mar 2008
- Beiträge
- 59
Diese Lösung scheint auch zu funktionieren. Danke dafür. Mal sehen, ob ich das noch umbaue, zugunsten der Ressourcen.
Zur Binärzahl: Aber werden Fließkommazahlen nicht praktisch als 2 Zahlen gespeichert? Eine die den Vorkommateil, und eine die den Nachkommateil angibt? Ich meine das so in Erinnerung zu haben, ist aber auch schon wieder ein Jahr her...
-
Dann wären es ja keine Fließkommazahlen...
Vom Prinzip her kann man zB.
123.678
ja auch als
123678 * 0.001
und damit als
123678 * 10^(-3)
sehen.
So wird das auch abgespeichert.
Als Kommalose Zahl und einer Zahl,
wie oft mit 10 multipliziert/dividiert wird,
um die Originalzahl zu bekommen.
(In der Praxis ist das noch um einiges komplizierter).Netiquette (vA §15) und Nutzungsregeln (vA §4.8) einhalten! Programmcode in Codetags/Codeboxen.
Sehr gute Beiträge bitte Bewerten (Stern darunter oder "Danke").
"Funktioniert nicht" ist zu ungenau! Code, Fehlermeldungen, Verhalten des Programms, ...?
-
23.10.11 21:55 #5
- Registriert seit
- Mar 2008
- Beiträge
- 59
Ach stimmt, die Erinnerung kommt wieder
Vielen Dank dafür, noch nen netten Abend wünsche ich!
Ähnliche Themen
-
3 (!) Float-Probleme im IE6/7 (Float über die Grenzen eines Elements hinaus)
Von marco12 im Forum CSSAntworten: 14Letzter Beitrag: 28.09.08, 11:00 -
eine Nachkommastelle bei double anzeigen
Von hugo1981 im Forum JavaAntworten: 7Letzter Beitrag: 07.04.08, 10:55 -
[VB.NET 2008] Nachkommastelle
Von Kenner3000 im Forum .NET Windows FormsAntworten: 1Letzter Beitrag: 31.03.08, 21:32 -
Nachkommastelle hinzufügen
Von Transporter im Forum PHPAntworten: 1Letzter Beitrag: 08.12.04, 15:28 -
Nachkommastelle
Von EM-Autotechnik im Forum PHPAntworten: 6Letzter Beitrag: 06.11.03, 00:14





Zitieren


Login





