在Java中,有两种主要类型用于表示浮点数:float(32位)和double(64位)。float精度较低,占用更少的内存,而double提供更高的精度,并且是浮点数的默认首选类型。
重要特点:
带有误差的比较示例:
public class DoubleComparison { public static void main(String[] args) { double a = 0.1 + 0.2; double b = 0.3; double epsilon = 1e-10; if (Math.abs(a - b) < epsilon) { System.out.println("在误差范围内相等"); } else { System.out.println("不相等"); } } }
问题: 下面的代码会输出什么?
System.out.println(0.1 + 0.2 == 0.3);
答案: 这段代码会输出false,因为0.1 + 0.2在IEEE 754的二进制格式中的结果不等于0.3,这是由于float和double类型存储小数的特性。
故事
在一个大型金融项目中,使用double类型作为现金计数器。实际上,小的操作经常导致误差积累,最终结果差异几分钱。问题通过将double替换为BigDecimal解决。
故事
在游戏引擎中,使用float数组存储世界中具有大值的物体坐标。当移动到远距离时,物体的定位精度开始丧失,导致屏幕上物体“抖动”。将float替换为double并且集中坐标帮助解决了问题。
故事
在统计分析程序中,使用
==运算符比较双精度值,导致意外数量的“未匹配”。替换为带有误差的比较后,程序逻辑正常工作。