查看: 849|回复: 5

[JAVA] java浮点数的坑

[复制链接]

2

技术

6

魅力

2

原创

病毒研究组

Rank: 8Rank: 8

积分
1721
人气
179
分享
17

最佳新人活跃会员

发表于 2022-7-16 13:27:01 | 显示全部楼层 |阅读模式
最近在学java,写了些小程序,在比较浮点数时,发现明明相等的两个浮点数比较结果却不相等,两个不相等的比较结果却是相等,还以为程序写的有问题,改了半天,最后通过下断点,调试时才发现问题

于是,我上网查资料,把常见的问题整理了下来
第一种:
[Java] 纯文本查看 复制代码
public class study2{
    public static void main(String[] args){
        float a = 2.3f;
        double b = (double)a;
        System.out.println("a = " + a);
        System.out.println("b = " + b);
    }
}

结果:
[Java] 纯文本查看 复制代码
a = 2.3
b = 2.299999952316284

第二种:
[Java] 纯文本查看 复制代码
public class study2{
    public static void main(String[] args){
        float a = 1f;
        float b = 0.99999999f;
        System.out.println(a==b);
    }
}

结果:
[Java] 纯文本查看 复制代码
true

第三种:
[Java] 纯文本查看 复制代码
public class study2{
    public static void main(String[] args){
        System.out.println(0.1+0.2);
    }
}

结果:
[Java] 纯文本查看 复制代码
0.30000000000000004

解决方案:
使用java.math包

2

技术

6

魅力

2

原创

病毒研究组

Rank: 8Rank: 8

积分
1721
人气
179
分享
17

最佳新人活跃会员

 楼主| 发表于 2022-7-16 15:38:52 | 显示全部楼层
本帖最后由 hackerbob 于 2022-7-16 15:42 编辑
zhangzhixiao 发表于 2022-7-16 15:15
所以,究竟是为什呢
原因:
float类型:

1.0(十进制)
    ↓
00111111 10000000 00000000 00000000(二进制)
    ↓
0x3F800000(十六进制)

0.99999999(十进制)
    ↓
00111111 10000000 00000000 00000000(二进制)
    ↓
0x3F800000(十六进制)

double类型:

1.0(十进制)
    ↓
00111111 10000000 00000000 00000000(二进制)
    ↓
0x3F800000(十六进制)

0.9999999(十进制)
    ↓
00111111 01111111 11111111 11111110(二进制)
    ↓
0x3F7FFFFE(十六进制)

由于精度问题,导致编译器转换二进制时转换错了


1

技术

25

魅力

7

原创

管理员

Rank: 9Rank: 9Rank: 9

积分
11343
人气
297
分享
42

论坛元老优秀版主活跃会员最佳新人灌水之王

发表于 2022-7-16 14:49:42 | 显示全部楼层


python也一样

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
Just do it.

2

技术

6

魅力

2

原创

病毒研究组

Rank: 8Rank: 8

积分
1721
人气
179
分享
17

最佳新人活跃会员

 楼主| 发表于 2022-7-16 15:08:47 | 显示全部楼层

竟然也一样。。。。

1

技术

14

魅力

1

原创

退休版主

Rank: 8Rank: 8

积分
8187
人气
416
分享
59

论坛元老活跃会员灌水之王荣誉管理

发表于 2022-7-16 19:32:43 | 显示全部楼层
hackerbob 发表于 2022-7-16 15:38
原因:
float类型:

是的,我们日常用的十进制在计算机看来是有一定漏洞的。

2

技术

6

魅力

2

原创

病毒研究组

Rank: 8Rank: 8

积分
1721
人气
179
分享
17

最佳新人活跃会员

 楼主| 发表于 2022-7-16 19:57:08 | 显示全部楼层
JimmyzZZ 发表于 2022-7-16 19:32
是的,我们日常用的十进制在计算机看来是有一定漏洞的。

嗯,所以java专门整了个math包,用来进行高精度计算
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表