2013-04-27 79 views
1

如果下一statement爲真:數據流浮點的Java

數據流使用一個非常糟糕的編程技術:它採用浮動 點數來表示的貨幣價值。一般來說,浮點數 對精確值不利。這對於小數點 分數尤其不利,因爲常用值(如0.1)沒有二進制 表示。

這是真的,數據流只用於非浮點值? 如果是這樣的話,這沒什麼用處。

回答

3

的報價是混淆了一些原因

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

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。

順便說一句C和C++沒有小數類型,但很多交易系統(過去大多數交易系統)都使用這些語言。他們通過使用int,longdouble類型來做到這一點,就像許多基於Java的交易系統一樣。大多數倫敦投資銀行都使用double AFAIK。 (我已經在超過幾個工作;)

這是真的,數據流只用於非浮點值?

DataInputStream常見的錯誤用於讀取文本。大約有30個問題和答案發布到一個月,它使用DataInputStream從文件中讀取文本,這是我積極試圖阻止的事情。

但是,DataInputStream對讀取所有基元類型,字符串和讀取完整字節[例如

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

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


如果你想如何低效BigDecimal的簡單比較雙

  • 的BigDecimal相比大約是100倍速度較慢執行基本的計算,它不支持複雜的是翻番呢。
  • double產生垃圾,BigDecimal產生很多。
  • 向流8個字節寫入一個double,將一個BigDecimal寫入ObjectOutputStream 290個字節。

什麼BigDecimal爲你做的是給你精確和受控的舍入內置。你必須知道如何使用Math.round,Math.floor,Math.ceil等功能來做同樣的事情。

+0

驚人的明顯的解釋,多謝彼得! – Rollerball 2013-04-27 09:51:39

1

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

如果您使用writeFloat(..)編寫浮點值,則您將使用readFloat()讀取完全相同的值。轉換值時只會失去精度,例如從雙倍到浮動。但是這與DataStreams無關。

+0

那麼我在這個問題中引用了哪些文字呢? – Rollerball 2013-04-27 09:17:43