Java中double、long类型是什么?与int、float的区别及适用场景
Java中long、double类型详解:定义、原理、对比与适用场景
一、long:处理大整数的首选
定义与底层逻辑
long是Java的64位有符号整数类型,可存储的范围为**-9223372036854775808到9223372036854775807**(约±9万亿亿级)。底层采用二进制补码存储,所有整数均为精确表示,不会出现精度损失——这是它和浮点数的本质区别。
和int的核心差异
- 范围差距极大:int是32位,最大只能存储±21亿,像大金额(如10亿级订单金额)、毫秒级时间戳(当前已达13位数字,远超21亿)这类数值,int完全装不下。
- 内存占用:long占8字节,int占4字节——但在现代硬件环境下,除非存储百万级以上的数组,否则这点差异基本可以忽略。
- 运算性能:64位JVM上long和int的运算速度无明显区别;32位JVM可能多几条指令,但日常开发中完全感知不到差异。
二、double:高精度浮点数的主力
定义与底层逻辑
double是64位双精度浮点数,遵循IEEE 754标准。它的范围极广(±1.7×10^308),精度可达15-17位有效数字。底层拆分为3部分存储:1位符号位(标记正负)、11位指数位(控制数值量级)、52位尾数位(决定精度)。
注意:由于二进制无法精确表示所有十进制小数(比如0.1),double属于近似存储,但精度远高于float。
和float的核心差异
- 精度差一个量级:float是32位,仅能保留6-7位有效数字——比如存储123456789,float会被截断为123456800,直接丢失两位有效数字;而double能完整保留所有9位数字。
- 范围限制:float的范围为±3.4×10^38,虽然也很大,但远不如double的覆盖范围广。
- 字面量默认规则:Java中写
0.1默认是double类型,要声明float必须加f后缀(如0.1f)。
三、该用long/double的场景,别选int/float
选long而非int的情况
- 数值超出int范围:比如存储毫秒级时间戳(
System.currentTimeMillis()返回值就是long)、超过21亿的计数(电商累计订单数、视频播放量)、大金额(如以分为单位的10亿人民币是10000000000,远超int上限)。 - 避免溢出风险:例如计算
100000 * 100000,int会直接溢出变成负数,用long则能正常得到10000000000的结果。 - 对接外部系统:数据库中的BIGINT类型,对应Java的long;如果强行用int存储,会直接报错或截断数据。
选double而非float的情况
- 需要高精度的小数计算:比如地理坐标(经纬度需精确到小数点后6位以上,float精度不足)、科学计算、统计分析——这些场景差一位小数可能导致结果完全偏离预期。
- 避免精度丢失:比如存储用户输入的精确数值(如123456.789012),float会丢弃末尾的有效数字,而double能完整保留。
- 大多数日常浮点数场景:除非需要存储几十万甚至上百万个浮点数(如3D模型的顶点数据)来节省内存,否则默认用double即可——精度更高,踩坑更少。
避坑提示
- 定义long字面量必须加
L后缀:比如long bigNum = 10000000000L;,不加的话编译器会将其识别为int,直接触发编译错误。 - double的精度陷阱:
0.1 + 0.2不等于0.3,因为二进制无法精确表示这两个数。如果是金融这类需要绝对精确的场景,不要用double,改用BigDecimal。 - 内存受限场景:比如嵌入式设备、极端内存紧张的应用,优先选择int/float;普通服务器、桌面应用无需纠结这点内存差异。
内容的提问来源于stack exchange,提问作者DUKE HAZARD
相关产品推荐
相关产品推荐

