探究背景
涉及诸如float或者double这两种浮点型数据的处理时,偶尔总会有一些怪怪的现象,不知道大家注意过没,举几个常见的栗子:
条件判断超预期
System.out.println( 1f == 0.9999999f ); // 打印:false System.out.println( 1f == 0.99999999f ); // 打印:true
数据转换超预期
float f = 1.1f; double d = (double) f; System.out.println(f); // 打印:1.1 System.out.println(d); // 打印:1.100000023841858
基本运算超预期
System.out.println( 0.2 + 0.7 ); // 打印:0.8999999999999999 纳尼?
数据自增超预期
float f1 = 8455263f;
for (int i = 0; i < 10; i++) {
System.out.println(f1);
f1++;
}
// 打印:8455263.0
// 打印:8455264.0
// 打印:8455265.0
// 打印:8455266.0
// 打印:8455267.0
// 打印:8455268.0
// 打印:8455269.0
// 打印:8455270.0
// 打印:8455271.0
// 打印:8455272.0
float f2 = 84552631f;
for (int i = 0; i < 10; i++) {
System.out.println(f2);
f2++;
}
// 打印:8.4552632E7 纳尼?不是 +1了吗?
// 打印:8.4552632E7 纳尼?不是 +1了吗?
// 打印:8.4552632E7 纳尼?不是 +1了吗?
// 打印:8.4552632E7 纳尼?不是 +1了吗?
// 打印:8.4552632E7 纳尼?不是 +1了吗?
// 打印:8.4552632E7 纳尼?不是 +1了吗?
// 打印ÿ

本文探讨了Java中Double和Float处理时出现的精度问题,通过实例揭示了浮点数比较和运算的非预期行为。文章深入分析了浮点数在计算机中的存储方式,特别是精度限制。为了解决精度问题,建议在处理高精度数值计算时使用BigDecimal类,介绍了BigDecimal的创建、运算和比较方法,适合于商品金额、交易值等场景。
最低0.47元/天 解锁文章
673

被折叠的 条评论
为什么被折叠?



