![]() |
Datenbank: firebird • Version: 2.1 • Zugriff über: Zeos
Rundungsproblem
hallo zusammen,
ich habe ein Variable "Bruttopreis" die aus nettopreis + mwst besteht( nettopreis und mwstsatz wird aus der db gefüllt. mwst mit dem mwstsatz berechnet). In der Variable Bruttopreis von typ currency habe so ich z.B 8496 stehen mit roundcurrency wird der Wert kaufmännisch richtig auf 8500 gerundet (als 0,85 € ) nun möchte ich diesen berechneten Wert auch in einem db grid anzeigen. da hier nur der mwstsatz und nicht die mwst als Wert vorhanden ist habe ich dazu die Query folgendermassen ergänzt:
SQL-Code:
wobei der mwstsatz aus einer anderen tabelle gelesen und als ParamByName('mwstsatz').Ascurrency übergeben wird.
round(nettopreis + (nettopreis/100 * CAST(:mwstsatz AS NUMERIC(15,2))),2) as bruttopreis
Leider wird so nicht richtig gerundet und ich erhalte als Ergebnis 84 anstatt 85 Wie kann ich in der query richtig runden? danke euch gruss KH |
Re: Rundungsproblem
SQL-Code:
TRUNC(nettopreis + (nettopreis/100 * CAST(:mwstsatz AS NUMERIC(15,2))) +0.5) as bruttopreis
|
Re: Rundungsproblem
Zitat:
Gruss KH |
Re: Rundungsproblem
Zitat:
|
Re: Rundungsproblem
Mein Code "rundet" auf ganze Stellen um entsprechende Nachkommastellen zu erhalen muss man entsprechend "Verschieben"
SQL-Code:
TRUNC((nettopreis + (nettopreis/100 * CAST(:mwstsatz AS NUMERIC(15,2))) +0.5) * 100) / 100 as bruttopreis
|
Re: Rundungsproblem
Zitat:
was macht das +0.5 ? |
Re: Rundungsproblem
- Trunc() schneidet alle Nachkommastellen ab
0,85 -> 0 - +0,5 bewirkt dass ab ,5 aufgerundet wird 0,4 + 0,5 -> 0,9 -> 0 0,5 + 0,5 -> 1 -> 1 |
Re: Rundungsproblem
Zitat:
ich brauche aber die funktion so, dass aus 0,849 auf 0,85 gerundet wird, und das klappt so leider nicht :-( edit: also ich muss z.B. auf netto 0,794 7% dazu rechnen, was 0,849 ergibt und dieses kaufmännisch runden |
Re: Rundungsproblem
Dann müsstest du das Komma temporär um 3 Stellen ( * 1000 / 1000) verschieben
|
Re: Rundungsproblem
Hallo KH
dann addiere doch 0,005! Allerdings hab ich ein leichtes Problem mit Deiner Vorgehensweise. Ich würde so viel wie möglich "in der DB" erledigen und dann den Rest mit Delphi, oder aber nur die Rohdaten aus der DB holen und dann in Delphi rechnen. Deine Lösung mit der HinundherCasterei sehe ich mit leichtem Unbehagen, da ich mit den unterschiedlichen Typen (Oracle/Delphi) in einem ähnlichen Fall auf die Nase gefallen bin. Gruß K-H |
Re: Rundungsproblem
Zitat:
mit: TRUNC(((nettopreis *1000) + (nettopreis* 1000/100 * CAST(:mwstsatz AS NUMERIC(15,2))) +0.5) ) as bruttopreis habe ich richtig gerundet das 1000 fache. bekomme ich das jetzt noch innerhalb des statements wieder durch 1000 geteilt in bruttopreis, oder geht das nicht ? |
Re: Rundungsproblem
Delphi-Quellcode:
<Ausdruck> := Trunc( <Ausdruck> * 10 ^<Stellen>) / 10 ^<Stellen>;
|
Re: Rundungsproblem
Zitat:
'select artikel_id,artikelpreis_id, bezeichnung, gilt_abmenge, nettopreis, TRUNC(((nettopreis *1000) + (nettopreis* 1000/100 * CAST(:mwstsatz AS NUMERIC(15,2))) +0.5) ) as bruttopreis from artikelpreise ............'); so hab ich jetzt in bruttopreis das richtig gerundete aber 1000 fache Eergebnis :-( |
Re: Rundungsproblem
Einfach nach dem Trunc durch 1000 teilen
|
Re: Rundungsproblem
Zitat:
wenn ich _nicht_ teile steht im currency-feld 8500000, also das tausendfache was ich brauche teile ich durch 10 steht im currency-feld 850000 teile ich durch 100 steht im currency-feld 80000 teile ich durch 1000 steht im currency-feld 0 was läuft da schief? :-( EDIT: sieht für mich so aus als würde das TRUNC erst nach den Rechenoperationen ausgeführt, oder? |
Re: Rundungsproblem
Zitat:
|
Re: Rundungsproblem
Zitat:
so: (TRUNC(((nettopreis *1000) + (nettopreis* 1000/100 * CAST(:mwstsatz AS NUMERIC(15,2))) +0.5) ))/1000 as bruttopreis funktionierts ja nicht :-( |
Re: Rundungsproblem
Und warum nicht?
|
Re: Rundungsproblem
Zitat:
|
Re: Rundungsproblem
Zitat:
im Moment mach ich das ja so: TColumn(self.Columns[3]).Field:= FpreiseQuery.FieldByName('bruttopreis'); |
Re: Rundungsproblem
Zitat:
Bei Integer/Integer kommt in Firebird Integer raus (Nachkommastellen abgeschnitten). Zur Veranschaulichung teste mal:
SQL-Code:
select 1, 3/4 from rdb$database
union all select 2, 3/4.0 from rdb$database union all select 3, 3/4.00 from rdb$database union all select 4, 3.0/4 from rdb$database union all select 5, 3.00/4 from rdb$database union all select 6, 3.0/4.0 from rdb$database |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:05 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz