1

如果下一个陈述为真:

DataStreams 使用了一种非常糟糕的编程技术:它使用浮点数来表示货币值。一般来说,浮点数不适合精确值。这对小数特别不利,因为常用值(例如 0.1)没有二进制表示。

那么数据流仅用于非浮点值是真的吗?如果是这种方式,它就没有那么有用了。

4

2 回答 2

3

由于多种原因,报价令人困惑

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,longdouble一般类型来做到这一点,就像许多基于 Java 的交易系统一样。伦敦的大多数投资银行都使用doubleAFAIK。(我曾在多家公司工作过;)

那么数据流仅用于非浮点值是真的吗?

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 执行基本计算的速度大约慢 100 倍,并且它不支持 double 所支持的复杂计算。
  • double 不会产生垃圾,BigDecimal 会产生很多。
  • 将一个 double 写入 8 字节流,将一个 BigDecimal 写入 ObjectOutputStream 290 字节。

BigDecimal 为您提供的是内置的精确和可控舍入。使用 double 您必须知道如何使用 Math.round、Math.floor、Math.ceil 等函数来做同样的事情。

于 2013-04-27T09:40:11.547 回答
1

DataStream 实现不会降低所写入数据类型的精度。

如果您使用 写入浮点值,writeFloat(..)您将使用 读取完全相同的值readFloat()。转换值时只会丢失精度,例如从 double 转换为 float。但这与 DataStreams 无关。

于 2013-04-27T09:00:11.847 回答