簡體   English   中英

JSON庫是否同意.5000 ... 1的雙精度值是什么?

[英]Do JSON libraries agree on what's the double-precision value of .5000…1?

如果我需要將C#中的浮點數精確地從JSON傳輸到Java,我可以使用JSON數字嗎?

如果沒有,為什么不呢? 哪些信息可能丟失,我如何保證保留該信息?

具體來說,我在Java中使用Json.NET在C#和Jackson(通過它的類ObjectMapper)。

看起來像double.TryParse是當Json.NET將數字解析為double時最終使用的,Double.parseDouble是當Jackson ObjectMapper將數字解析為double時最終使用的。

我可以期待Microsoft的double.TryParse和Java的Double.parseDouble完全同意每個JSON號碼的值嗎?

我很擔心,因為JSON號碼中的位數不受ECMA-404,IETF RFC 7159或json.org的限制。 這個另一個問題( 可以影響雙倍的最大小數位數 )讓我想知道我有多信任一個共同的信念,即17個十進制數字的第一個塊(丟棄前導零),或者實際上任何有界數字的十進制數字,足以確定雙精度浮點值。

那么,對於浮點數,小數位數並不重要。 重要的是數字可以用二進制表示。 您可能已經知道某些數字無法准確表示。 浮點始終是近似值。

由於C#Java使用相同的規范(IEEE 754),任何數字的Java能夠表示為double應該轉換為完全相同的二進制形式。

可以安全地忽略問題的JSON部分。 在這兩種情況下,它只是一個被解析的字符串。 重要的是:

  • 在數據類型double在這兩個系統是相同的。
  • 如果是這樣, double.TryParseDouble.parseDouble總是為set輸入返回相同的double值。
  • 並且未經證實:這里的數據結構是否真的是雙重的?

正如Juunas所說,兩者都使用相同的雙打規格,所以你應該能夠考慮double相同。

解析文檔中的任何內容都不能保證與其他文檔的可比性,也不管如何處理無法在任何文檔中指定的數字。

然而,由於你在這里使用雙打,並且(假設你使用的是他們不對的知識的雙打)他們可能“足夠好”,如果他們不“足夠好”,那么很可能會使雙打無論如何都要正確的數據結構,你應該看一個固定的十進制格式。 如何使用JSON是一個不同的問題。 :)

不,並非每個JSON編號都可以使用某些特定的IEEE 754二進制64(也稱為雙精度又名“雙”)編號進行嚴格轉換。

在許多情況下,使用JSON數字就足夠了。 這取決於您或您傳輸數據的人員需要什么。 如果沒有JSON之外的協議,將不會有一個清晰的定義,哪個JSON數字相當於哪個加倍。 但是,在許多情況下,您可以隱含地假設所需的精度完全在雙精度范圍內。 許多浮點數是使用易於負擔得起的儀器進行的物理測量。

這是在JSON之外做出精確協議的一種方法。 一位作者網絡上的一篇文章中建議,如果一個double實際上是你想要的,那么在你的JSON中你可以放置一個包含該結構的三個組件的數組或對象作為整數:sign,exponent和mantissa。 然后,使用該文檔的人將需要知道從被視為整數的三個組件中解釋雙精度的規則。 當“指數”整數為2047時,double值為NaN ,依此類推。

存在更復雜和更標准的可能性。 您可以使用HDF5或類似產品,如果您需要它。 關於如何在JSON中表示HDF5已經有多個規范。 然后,您的JSON文檔可以通過將您的號碼注釋為H5T_IEEE_F64BE類型以HDF5的方式自我描述。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM