我是靠谱客的博主 纯真手套,最近开发中收集的这篇文章主要介绍Java double/float数据类型中的0.0和-0.0问题,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

在写LeetCode的时候,一个题目需要计算两两点之间的斜率,使用double类型数据保存的时候,已经有预感到了精度的问题了,自己认为理论上在一次计算中,对于同一个double值如0.5,在同一个计算机类数据表示形式是一样的,可以忽略不计,但是实际中遇见的是double数据类型0.0和-0.0的比较问题。

System.out.println(0.0 == -0.0);
System.out.println(Double.compare(0.0, -0.0));
System.out.println(new Double(0.0).equals(new Double(-0.0)));
Map<Double, Integer> map = new HashMap<>();
map.put(0.0, 1);
map.put(-0.0, 2);
System.out.println(map.size());
System.out.println((double)(2-2)/(1-2));
System.out.println((double)(3-3)/(2-1));

输出结果如下所示:

true
1
false
2
-0.0
0.0

在集合中遇见0.0和-0.0时,由于自动装箱,导致两个在绝对数值上相等的数据,放入集合时表现出不相等。
解决办法:
对获得的double类型数据加上一个0.0

Map<Double, Integer> map = new HashMap<>();
map.put(0.0, 1);
map.put(-0.0+0.0, 2);
System.out.println(map.size());
1

PS:对于float类型也是一样,jdk上的解释:
有以下两种例外情况:
- 如果 f1 和 f2 都表示 Float.NaN,那么即使 Float.NaN==Float.NaN 的值为 false,equals 方法也将返回 true。
- 如果 f1 表示 +0.0f,而 f2 表示 -0.0f,或相反,那么即使 0.0f==-0.0f 的值为 true,equal 测试也将返回 false。
该定义使得哈希表得以正确操作。
具体参考:
http://www.programgo.com/article/4441958781/
http://blog.csdn.net/ouy5933/article/details/72461239

最后

以上就是纯真手套为你收集整理的Java double/float数据类型中的0.0和-0.0问题的全部内容,希望文章能够帮你解决Java double/float数据类型中的0.0和-0.0问题所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(50)

评论列表共有 0 条评论

立即
投稿
返回
顶部