簡體   English   中英

Datastreams浮點Java

[英]Datastreams floating point Java

如果下一個陳述是真的:

DataStreams使用一種非常糟糕的編程技術:它使用浮點數來表示貨幣值。 通常,浮點對於精確值是不利的。 對於小數分數尤其不好,因為常見值(例如0.1)沒有二進制表示。

那么數據流只能用於非浮點值嗎? 如果是這樣的話,那就不那么有用了。

引用令人困惑,原因有很多

DataStreams使用一種非常糟糕的編程技術:它使用浮點數來表示貨幣值。

DataStream沒有任何關於如何發送貨幣值的說法。 沒有發送價格/貨幣/貨幣方法。 你如何發送貨幣價值完全取決於你,

通常,浮點對於精確值是不利的。

float對於精確值非常糟糕,因為它只有6位數的精度。 另一方面, double至少有15位數的精度,這通常綽綽有余。 即您可以准確地表示高達$ 70,000,000,000,000.00的價值

一般來說,我會避免浮動,因為它不值得你保存的記憶(除非你有數百萬或數十億)

對於小數分數尤其不好,因為常見值(例如0.1)沒有二進制表示。

這沒有精確的二進制表示,雙重到文本轉換隱含地補償。 例如

double d = 0.1; // no a precise representation
System.out.println(d); // print 0.1 as the conversion is aware this what should be displayed.

雖然表示錯誤可能是頭痛,但它們並不是某些人似乎相信的隨機錯誤。 它們可以通過合理的舍入來確定和控制。

如果你想使用BigDecimal作為你的值,你可以,你可以將它寫入DataStream。

BTW C和C ++沒有十進制類型,但許多交易系統(過去大多數交易系統)都使用這些語言。 他們通常使用intlongdouble類型來做到這一點,就像許多基於Java的交易系統一樣。 倫敦的大多數投資銀行都使用double AFAIK。 (我已經工作了不少;)

那么數據流只能用於非浮點值嗎?

DataInputStream的常見誤用是讀取文本。 大約有30個問題和答案發布到SO一個月,它使用DataInputStream從文件中讀取文本,這是我正在積極嘗試停止的。

但是,DataInputStream可用於讀取所有基本類型,字符串和讀取完整字節[],例如

byte[] bytes = new byte[64];
dataInputSTream.readFully(bytes); // don't return unless 64 bytes have been read.

注意:DataStream假定Big Endian或Network order。 不幸的是,大多數桌面和移動系統都使用Little Endian,這意味着如果要與C程序交換數據,則需要使用ByteBuffer。


如果你想簡單比較BigDecimal與double相比效率如何

  • BigDecimal執行基本計算的速度大約慢100倍,並且它不支持復雜的雙重計算。
  • double不產生垃圾,BigDecimal產生很多。
  • 將一個double寫入一個8字節的流,將一個BigDecimal寫入一個280字節的ObjectOutputStream。

BigDecimal為您做的是為您提供精確且受控的內置舍入。使用double,您必須知道如何使用Math.round,Math.floor,Math.ceil等函數來執行相同的操作。

DataStream實現不會降低寫入的數據類型的精度。

如果您在使用編寫浮點值writeFloat(..)你會讀到准確使用相同的值readFloat() 轉換值時,例如從double到float,只會丟失精度。 但這與DataStreams無關。

暫無
暫無

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

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