一、精度丢失的根源
在 Java 中,double 类型基于 IEEE 754 标准 实现双精度浮点数,其精度丢失问题源于 二进制表示与十进制小数的天然差异。以下从原理、案例两方面详细解析:
1. 二进制无法精确表示所有十进制小数
十进制小数如 0.1 在二进制中是 无限循环小数(类似十进制中 1/3=0.333...)。
0.1的二进制表示:0.0001100110011...(无限重复0011)。- 由于
double仅 64 位(1 位符号位 +11 位指数位 +52 位尾数位),必须截断,导致 舍入误差。
2. 浮点数的运算规则
浮点数运算(加、减、乘、除)会引入新的舍入误差。例如:
0.1 + 0.2 在二进制中先分别表示为近似值,相加后再次舍入,最终结果不等于 0.3。
二、典型案例演示
public class DoublePrecisionDemo {
public static void main(String[] args) {
double a = 0.1;
double b = 0.2;
double c = a + b;
System.out.println("0.1 + 0.2 = " + c); // 输出:0.30000000000000004
}
}


