![]() |
Datenbank: MS SQL • Version: 2008R2 • Zugriff über: MSSMS
MS SQL Genauigkeit in der Termauswertung
Das erwischt mich jetzt am falschen Fuß:
Dass das da
Code:
nicht dasselbe Ergebnis hat, verstehe ich ja noch.
select 12/100*0.5
select 0.5/100*12 Aber dass das auch nicht dasselbe Ergebnis hat
Code:
hätte ich nicht erwartet.
select 0.1*(12/100*0.5)
select 0.1*(0.5/100*12) |
AW: MS SQL Genauigkeit in der Termauswertung
Zitat:
Computer rechnen binär und mit einer limitierten Zahl von Bits pro Variablen. Sowohl die Konvertierung Dezimal nach Binär als auch die Operatione selbst haben deshalb kleine Abweichungen vom mathematisch exakten Ergebnis, weshalb auch das Kommunitativgesetz nicht strikt erfüllt ist: das Ergebnis ist abhängig von der Reihenfolge, in der mathematische Operationen ausgeführt werden. |
AW: MS SQL Genauigkeit in der Termauswertung
Hallo,
Firebird macht es richtig ... Es kommt in beiden Fällen 0.006 raus. Vielleicht musst du noch ein Cast auf Double Precision machen: select cast((0.1*(12/100*0.5) as double precision) |
AW: MS SQL Genauigkeit in der Termauswertung
Also generell gilt normalerweise das die Positionen bei Punktrechnung beliebig tauschen kannst.
MS SQL scheint den "Bruch" (12/100 bzw. 0,5/100) nicht zu erkennen und zieht einfach die Punktrechnung vor. Daher bekommst du falsche und verschiedene Ergebnisse: select 12/100*0.5 => 12/50 = 0.24 select 0.5/100*12 => 0.5/1200 = 0.00041666 Normalerweise wäre 0.06 das richtige Ergebnis. bzw. select 0.1*(12/100*0.5) => 0.1*(12/50) = 0.1*0.24 = 0.024 select 0.1*(0.5/100*12) => 0.1*(0.5/1200) = 0.1*0.00041666 = 0.000041666 Normalerweise wäre 0.006 das richtige Ergebnis. Du müsstest also schreiben (ungetestet): select (12/100)*0.5 => 0.12*0.5 = 0.06 select (0.5/100)*12 => 0.005*12 = 0.06 bzw. select 0.1*(12/100)*0.5 = 0.006 select 0.1*(0.5/100)*12 = 0.006 |
AW: MS SQL Genauigkeit in der Termauswertung
Missverständnis. Erstes und zweites beispiel liefern natürlich unterschiedliche Ergebnisse. Sind ja auch mathematisch was anderes.
Das: select 12/100*0.5 liefert 0, während select 0.5*12/100 das erwartete Ergebnis liefert. Meine Vermutung war, 12 als Integer die Genauigkeit vorgibt, sprich: keine Kommastellen. Darum mein Versuch mit select 0.1*12/100*0.5 Kommastellen zu erzwingen, aber nada. Die Doku sagt, dass Terme - also das 12/100 mit der Genauigkeit ihrer Operanden ausgewertet werden. Also ergibt 12/100 0. Und nein: Der SQL Server kann schon richtig rechnen: Punkt vor Strich etc. |
AW: MS SQL Genauigkeit in der Termauswertung
Zitat:
Ich bin mir jetzt auch keiner Server-Einstellung bewusst, die das beeinflussen könnte. |
AW: MS SQL Genauigkeit in der Termauswertung
Zitat:
|
AW: MS SQL Genauigkeit in der Termauswertung
Was kommt denn bei Dir da so raus?
Firebird:
SQL-Code:
liefert hier 0 und 0
select 0.1 * (12 / 100 * 0.5) as a, 0.1 * (0.5 / 100 * 12) as b from dual;
SQL-Code:
liefert hier 0 und 0,006
select 0.1 * (12 / 100 * 0.500) as a, 0.1 * (0.500 / 100 * 12) as b from dual;
SQL-Code:
liefert hier 0,006 und 0,006
select 0.100 * (12 / 100.000 * 0.5000) as a, 0.100 * (0.5000 / 100 * 12) as b from dual;
hä??? Da wird also "innendrinnen" irgendwie implizit gerundet auf die Zahl der da gerade (zufällig) anwesenden oder eben auch nicht anwesenden Nachkommastellen. Oder anders ausgedrückt: Wir haben hier Ganzzahl- und Nachkommazahlen. Da wird eine Typkonvertierung gemacht, entweder auf Ganzzahl oder auf Nachkommazahl. Und dann wird da "irgendwie" entsprechend gerundet ;-) Achso: Bevor ich es vergesse: Die Ergebnisse mit einem Delphiprogramm über die ADO-Komponenten (s. o.) sind andere, als die über FlameRobin:
SQL-Code:
liefert 0,00 und 0,00
select 0.1 * (12 / 100 * 0.5) as a, 0.1 * (0.5 / 100 * 12) as b from dual;
SQL-Code:
liefert 0,0000 und 0,0060
select 0.1 * (12 / 100 * 0.500) as a, 0.1 * (0.500 / 100 * 12) as b from dual;
SQL-Code:
liefert 0.0060000000 und 0.0060000
select 0.100 * (12 / 100.000 * 0.5000) as a, 0.100 * (0.5000 / 100 * 12) as b from dual;
Upps :oops: |
AW: MS SQL Genauigkeit in der Termauswertung
@Delphi.Narium: Kannst du mein Beispiel mit der Klammersetzung auch mal ausgeben und Posten (oder rein editieren)? Würde mich einfach mal interessieren.
Zitat:
SQL-Code:
select 0.1 * (12 / 100 * 0.50) as a, 0.1 * (0.50 / 100 * 12) as b from dual;
|
AW: MS SQL Genauigkeit in der Termauswertung
Hallo,
12/100.00 vielleicht? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:47 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 by Thomas Breitkreuz