Warum unterscheidet sich die Gleitkommaausgabe von Plattform zu Plattform?Java

Java-Forum
Anonymous
 Warum unterscheidet sich die Gleitkommaausgabe von Plattform zu Plattform?

Post by Anonymous »

Soweit ich weiß, werden extrem große vom Benutzer eingegebene Zahlen aufgrund des IEEE 754-Standards nicht präzise im Binärformat gespeichert. Wenn solche ungenau gespeicherten Werte zur Anzeige auf der Konsole wieder in Dezimalzahlen umgewandelt werden, sollte die Ausgabe dann über verschiedene Betriebssysteme (Windows/Linux) und CPU-Architekturen hinweg konsistent bleiben?
Ich frage, weil Mein Client verwendet JDBC und wir haben festgestellt, dass sich die Ausgabewerte zwischen Windows- und Linux-Umgebungen unterscheiden. Nach dem Speichern von 123456.6543214586532653516 in der Datenbank und dem Drucken auf der Konsole von Linux- und Windows-Systemen sind die Ergebnisse beispielsweise unterschiedlich:

Code: Select all

Linux:   123456.65432145866000000000
Windows: 123456.65432145864000000000
Ich verstehe, dass der Eingabewert aufgrund der Einschränkungen der Gleitkommadarstellung nicht genau gespeichert werden kann, aber ich verstehe nicht, warum die Konsolenausgabe je nach Umgebung unterschiedlich ist.
Zur weiteren Untersuchung habe ich den gleichen Wert sowohl in Python als auch in Java in meinen x86-Windows- und x86-Linux-Umgebungen getestet. Konkret habe ich einer Variablen den Wert 123456.6543214586532653516 zugewiesen und ihn direkt auf der Konsole ausgegeben. In beiden Umgebungen war die Ausgabe konsistent 123456.65432145866, unabhängig vom Betriebssystem oder der virtuellen Maschine.
Kann jemand erklären, was diese Inkonsistenz verursachen könnte?
=========================================== ======
Erste Bearbeitung
Genauer gesagt geht dieses Problem auf eine Frage zurück, die mein Kollege von einem Kunden erhalten hat. Da es sich hierbei nicht um eine Frage handelt, die ich direkt erhalten habe, und da mein Kollege und ich unterschiedliche Aufgaben bearbeiten, beschränken sich die mir zur Verfügung stehenden Informationen leider auf das, was ich hier mitteile. Sowohl mein Kollege als auch ich arbeiten für ein Datenbankunternehmen namens Tibero, das Abfragen unterstützt, die denen in Oracle ähneln. Der Kunde berichtete, dass er unter Windows und Linux unterschiedliche Ergebnisse erhält, wenn er denselben Java-Code ausführt. Leider gehört der Java-Code dem Kunden und wir können ihn daher nicht weitergeben. Der Kunde erwähnte jedoch, dass die folgende SQL-Abfrage, ausgeführt in tbsql – dem CLI-Tool unseres Unternehmens, das sqlplus ähnelt – ebenfalls die gleiche Diskrepanz erzeugt:

Code: Select all

CREATE TABLE convert_test(c1 BINARY_DOUBLE);
INSERT INTO convert_test VALUES(123456.6543214586532653516);
SELECT TO_CHAR(c1, '999999999999999D9999999999999999999', 'NLS_NUMERIC_CHARACTERS = ''.'''') AS formatted_value
FROM convert_test;
Leider konnte ich das Problem in meiner Umgebung nicht reproduzieren. Ich verstehe, dass Tibero für Sie möglicherweise kein vertrautes oder leicht zugängliches Produkt ist, und ich schätze die Herausforderungen, die dies bei der Suche nach einer Antwort mit sich bringen könnte.
Nur zur Kontrolle habe ich auch PostgreSQL installiert sowohl Windows als auch Linux und führte die folgende Abfrage aus. Die Ergebnisse waren auf allen Plattformen konsistent und zeigten keine Unterschiede:

Code: Select all

CREATE TABLE convert_test (
c1 DOUBLE PRECISION
);
INSERT INTO convert_test VALUES (123456.6543214586532653516);
SELECT C1 FROM CONVERT_TEST;

c1
--------------------
123456.65432145866

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post