2016-03-01 12 views
6

Se ho bisogno di trasmettere numeri in virgola mobile esattamente da C# a JSON in Java, posso usare i numeri JSON?Le librerie JSON concordano su quale sia il valore a precisione doppia di .5000 ... 1?

In caso contrario, perché no? Quali informazioni potrebbero essere perse e come posso garantire di mantenerlo?

Per essere precisi, sto usando Json.NET in C# e Jackson (attraverso la sua classe ObjectMapper) in Java.

Sembra double.TryParse è ciò che viene infine utilizzato quando Json.NET analizza un numero da raddoppiare e Double.parseDouble è ciò che viene infine utilizzato quando Jackson ObjectMapper analizza un numero da raddoppiare.

Posso aspettarmi che Microsoft double.TryParse e Java Double.parseDouble concordino esattamente sul valore di ogni numero JSON?

Sono preoccupato perché il numero di cifre in un numero JSON non è limitato in ECMA-404, IETF RFC 7159 o json.org. Questa altra domanda (Maximum number of decimal digits that can affect a double) mi fa domandare quanto posso fidarmi di una credenza comune secondo cui il primo blocco di 17 cifre decimali (dopo aver scartato gli zeri iniziali), o in realtà qualsiasi numero limitato di cifre decimali, è sufficiente per determinare una precisione doppia valore in virgola mobile.

+3

Non tutti si basano sulla precisione "doppia" se ciò è realmente importante (non importa per la maggior parte delle applicazioni, ma potrebbe esserlo in alcuni). Come implica il moniker 'double', la precisione è _finite_. Nei rari casi in cui ciò è importante, pensa di utilizzare una rappresentazione arbitraria di precisione dei numeri razionali. C'è anche matematica simbolica, sebbene sia di tipo ortogonale rispetto alla precisione, può o non può essere rilevante per quello che stai facendo. tl; dr il più delle volte non è una vera preoccupazione. se lo è, non usare il doppio. – Cubic

risposta

2

La parte JSON della domanda può essere tranquillamente ignorata. In entrambi i casi è solo una stringa che viene analizzata. Ciò che conta è:

  • I tipi di dati double sono identici in entrambi i sistemi.
  • In tal caso, double.TryParse e Double.parseDouble restituiscono sempre lo stesso valore double per un ingresso impostato.
  • E il non richiesto: la doppia è davvero la struttura dati corretta qui?

Come afferma Juunas, entrambi usano la stessa specifica per il doppio, quindi dovresti essere in grado di considerare double identico.

Nulla in entrambi i documenti di analisi garantisce la comparabilità con l'altro, né è il modo in cui la gestione di numeri che non possono essere rappresentati specificato in entrambi i documenti.

Tuttavia, come si usa il doppio qui, e (supponendo che si stia usando il doppio con la consapevolezza che non hanno ragione) probabilmente sono "abbastanza buoni", e se non sono "abbastanza buoni" allora è probabilmente questo raddoppia la giusta struttura dati e dovresti essere guardato in un formato decimale fisso. Come funziona con JSON è una domanda diversa. :)

3

Bene, per i numeri in virgola mobile la quantità di decimali non ha molta importanza. Ciò che conta è che il numero possa essere rappresentato esattamente in binario. Potresti già sapere che alcuni numeri non possono essere rappresentati esattamente. Il punto di virata è sempre un'approssimazione.

Poiché C# e Java utilizzano la stessa specifica (IEEE 754), qualsiasi numero che Java è stato in grado di rappresentare come un doppio dovrebbe convertirsi nello stesso modulo binario esatto.

+0

Grazie, apprezzo diversi punti positivi nella tua risposta: scopi pratici. Viaggi di andata e ritorno: potrebbe non essere il mio caso, ma è sicuramente importante. IEEE 754: se entrambe le conversioni mirano all'arrotondamento più vicino, i pareggi a pari, potrebbero essere prevedibilmente coerenti - forse questo è il genere di cose che avevate in mente. –

+0

Ho riformulato la domanda un po 'nella speranza che, in base alla revisione, possa avere una risposta definitiva. –

1

No, non tutti i numeri JSON sono rigorosamente convertibili con un particolare numero IEEE 754 binary64 (noto anche come doppia precisione "doppio").

In molte situazioni è sufficiente utilizzare i numeri JSON. Dipende da ciò che ti garantisce, o dalle persone di cui i dati che stai trasmettendo, avranno bisogno.Senza un accordo al di fuori di JSON non ci sarà una definizione chiara di quali numeri JSON sono equivalenti a quelli doppi. Tuttavia, in molte situazioni è possibile ipotizzare implicitamente che la precisione necessaria sia ben entro i limiti del doppio. Molti numeri in virgola mobile sono misurazioni fisiche realizzate con strumenti facilmente accessibili.

Ecco un modo per fare un accordo preciso al di fuori di JSON. One writer suggerito in an article on the web che se un doppio è realmente ciò che si desidera, quindi nel JSON è possibile posizionare un array o un oggetto che contiene i tre componenti di tale struttura come numeri interi: segno, esponente e mantissa. Quindi le persone che usano il documento dovranno conoscere le regole di interpretazione di un doppio dalle sue tre componenti considerate come numeri interi. Quando il numero intero "esponente" è 2047, il doppio valore è NaN e così via.

Esistono possibilità più elaborate e più standard. Puoi usare HDF5 o confrontabile se è quello di cui hai bisogno. C'è già più di una specifica su come rappresentare HDF5 in JSON. Quindi il tuo documento JSON può essere auto-descrittivo secondo le modalità di HDF5 annotando il tuo numero come di tipo H5T_IEEE_F64BE.

Problemi correlati