如果下一statement爲真:數據流浮點的Java
數據流使用一個非常糟糕的編程技術:它採用浮動 點數來表示的貨幣價值。一般來說,浮點數 對精確值不利。這對於小數點 分數尤其不利,因爲常用值(如0.1)沒有二進制 表示。
這是真的,數據流只用於非浮點值? 如果是這樣的話,這沒什麼用處。
如果下一statement爲真:數據流浮點的Java
數據流使用一個非常糟糕的編程技術:它採用浮動 點數來表示的貨幣價值。一般來說,浮點數 對精確值不利。這對於小數點 分數尤其不利,因爲常用值(如0.1)沒有二進制 表示。
這是真的,數據流只用於非浮點值? 如果是這樣的話,這沒什麼用處。
的報價是混淆了一些原因
數據流使用一個非常糟糕的編程技術:它使用浮點數來表示的貨幣價值。
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
,long
和double
類型來做到這一點,就像許多基於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爲你做的是給你精確和受控的舍入內置。你必須知道如何使用Math.round,Math.floor,Math.ceil等功能來做同樣的事情。
DataStream實現不會降低寫入的數據類型的精度。
如果您使用writeFloat(..)
編寫浮點值,則您將使用readFloat()
讀取完全相同的值。轉換值時只會失去精度,例如從雙倍到浮動。但是這與DataStreams無關。
那麼我在這個問題中引用了哪些文字呢? – Rollerball 2013-04-27 09:17:43
驚人的明顯的解釋,多謝彼得! – Rollerball 2013-04-27 09:51:39