使用正确的数字数据类型

时间:2009-11-07 03:28:03

标签: java types numbers

在更多地参与培训新工程师以及阅读Jon Skeet's DevDays presentation后,我开始意识到许多工程师在何时使用哪种数字数据类型时并不清楚。我很欣赏正式计算机科学学位在帮助实现这一目标方面所起的作用,但我看到很多新工程师表现出不确定性,因为他们从未使用大型数据集,财务软件,编程术语或统计问题,或复杂的数据存储问题

我的经验是,当人们在上下文中解释概念时,人们会真正理解这些概念。我正在寻找真正的编程问题的好例子,其中某些数据最好用数据类型表示。如果可能的话,尽量远离教科书的例子。我用Java标记这个,但是可以自由地用其他语言给出例子并重新命名:

Integer,Long,Double,Float,BigInteger等......

5 个答案:

答案 0 :(得分:28)

我真的认为你不需要例子或任何复杂的东西。这很简单:

  • 这是一个整数吗?
    • 可以> 2 ^ 63?的BigInteger
    • 可以> 2 ^ 31?长
    • 否则为int
  • 是十进制数吗?
    • 近似值好吗?
    • 是否需要准确? (例如:货币金额!)
      • 的BigDecimal

(当我说“>”时,我的意思是“绝对值更高”,当然。)

我从未使用过字节或字符来表示数字,而且我从未使用过短期。这是12年的Java编程。浮动?咩。如果你有一个巨大的阵列,并且你有记忆问题,我想。

请注意,BigDecimal有点错误;您的值 not 根本不需要它。

答案 1 :(得分:4)

BigDecimal在保持精确的浮点计算方面是最好的,并且能够指定所需的精度。我认为浮动(在某种程度上是双倍的)比BigDecimal提供了性能优势,但是以准确性和可用性为代价。

答案 2 :(得分:4)

您可能希望阐明的一个重点是,将浮点数进行比较几乎总是错误的。例如,以下代码很可能失败:

double euros = convertToEuros(item.getCostInDollars());
if (euros == 10.0) {
  // this line will most likely never be reached
}

这是您希望使用离散数字来表示货币的众多原因之一。

当你绝对必须比较浮点数时,你只能这样做;在某种程度上:

double euros = convertToEuros(item.getCostInDollars());
if (Math.abs(euros - 10.0) < EPSILON) {
  // this might work
}

至于实际例子,我通常的经验法则是这样的:

  • double:在使用它之前要长久思考;是值得的痛苦吗?
  • float:不要使用它
  • byte:最常用作byte []来表示一些原始二进制数据
  • int:这是你最好的朋友;用它来代表大多数东西
  • long:将其用于时间戳和数据库ID
  • BigDecimal和BigInteger:如果你知道这些,你很可能知道你在做什么,所以你不需要我的建议

我意识到这些不是非常科学的经验法则,但如果您的目标受众不是计算机科学家,那么最好坚持基础。

答案 3 :(得分:1)

通常是数字,如果我们说机器独立(32 / 64bit)数据类型大小如下,

整数:4个字节

长:8个字节

decimal / float:4bytes

double:8bytes

并且有符号值的大小减少到一半(例如:4bytes,unsigned = 4billions,signed = 2billions)

bigInt(取决于语言实现)有时最多10个字节。

对于大容量数据存档(例如搜索引擎),我强烈建议使用byte和short来节省空间。

字节:1个字节,(0-256无符号,-128 - 128个签名)

短:2字节(65k无符号)


假设你想保存关于AGE的记录,因为没有人住过150,所以你使用数据类型BYTE(读上面的大小)但是如果你使用INTEGER你已经浪费了额外的3bytes并认真地告诉我生活超过4bieions年。

答案 4 :(得分:1)

Lucene的VInt是魔鬼。通过逐字节读取它们的性能损失,大小的好处被大大超过了。

谈论的好处是空间与时间的关系。在1996年节省200mb是很好的,但在2010年,颠覆IO缓冲区一次读取一个字节是非常糟糕的。