如果下一个陈述为真:
DataStreams 使用了一种非常糟糕的编程技术:它使用浮点数来表示货币值。一般来说,浮点数不适合精确值。这对小数特别不利,因为常用值(例如 0.1)没有二进制表示。
那么数据流仅用于非浮点值是真的吗?如果是这种方式,它就没有那么有用了。
如果下一个陈述为真:
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++ 没有十进制类型,但许多交易系统(过去大多数交易系统)都使用这些语言。他们通过使用int
,long
和double
一般类型来做到这一点,就像许多基于 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 顺序。不幸的是,大多数桌面和移动系统都使用 Little Endian,这意味着如果您想与 C 程序交换数据,则需要使用 ByteBuffer。
如果您想简单比较 BigDecimal 与 double 相比的效率如何
BigDecimal 为您提供的是内置的精确和可控舍入。使用 double 您必须知道如何使用 Math.round、Math.floor、Math.ceil 等函数来做同样的事情。
DataStream 实现不会降低所写入数据类型的精度。
如果您使用 写入浮点值,writeFloat(..)
您将使用 读取完全相同的值readFloat()
。转换值时只会丢失精度,例如从 double 转换为 float。但这与 DataStreams 无关。