繁体   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