在更多地参与培训新工程师以及阅读Jon Skeet's DevDays presentation后,我开始意识到许多工程师在何时使用哪种数字数据类型时并不清楚。我很欣赏正式计算机科学学位在帮助实现这一目标方面所起的作用,但我看到很多新工程师表现出不确定性,因为他们从未使用大型数据集,财务软件,编程术语或统计问题,或复杂的数据存储问题
我的经验是,当人们在上下文中解释概念时,人们会真正理解这些概念。我正在寻找真正的编程问题的好例子,其中某些数据最好用数据类型表示。如果可能的话,尽量远离教科书的例子。我用Java标记这个,但是可以自由地用其他语言给出例子并重新命名:
Integer,Long,Double,Float,BigInteger等......
答案 0 :(得分:28)
我真的认为你不需要例子或任何复杂的东西。这很简单:
(当我说“>”时,我的意思是“绝对值更高”,当然。)
我从未使用过字节或字符来表示数字,而且我从未使用过短期。这是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
}
至于实际例子,我通常的经验法则是这样的:
我意识到这些不是非常科学的经验法则,但如果您的目标受众不是计算机科学家,那么最好坚持基础。
答案 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缓冲区一次读取一个字节是非常糟糕的。