gpt4 book ai didi

用于 float 的 java 哈希码

转载 作者:行者123 更新时间:2023-11-30 08:24:51 25 4
gpt4 key购买 nike

我想使用 Double(或 Float)作为 Hashmap 中的键

Map<Double, String> map = new HashMap<Double, String>()
map.put(1.0, "one");
System.out.println(map.containsKey(Math.tan(Math.PI / 4)));

这会返回 false。

如果我比较这两个数字,我会做这样的事情

final double EPSILON = 1e-6;
Math.abs(1.0 - Math.tan(Math.PI / 4)) < EPSILON

但是因为 Hashmap 会使用 hashcode 它对我来说是个问题。

我想实现一个 roundKey 函数,在将它用作键之前舍入到 EPSILON 的某个倍数

map.put(roundKey(1.0), "one")
map.containsKey(roundKey(Math.tan(Math.PI / 4)))
  • 有更好的方法吗?
  • 实现这个roundKey的正确方法是什么?

最佳答案

如果您知道什么舍入是合适的,您就可以使用它。例如如果需要四舍五入,可以四舍五入到小数点后两位。

但是,对于上面的示例,离散舍入到固定精度可能不合适。例如如果您四舍五入到小数点后 6 位,1.4999e-6 和 1.5001e-6 将不匹配,因为一个向上舍入,另一个向下舍入,即使差异为 << 1e-6。

在那种情况下,您最接近的做法是使用 NavigableMap

NavigableMap<Double, String> map = new TreeMap<>();

double x = ....;
double error = 1e-6;

NavigableMap<Double, String> map2 = map.subMap(x - error, x + error);

或者你可以使用

Map.Entry<Double, String> higher = map.higherEntry(x);
Map.Entry<Double, String> lower = map.lowerEntry(x);
Map.Entry<Double, String> entry = null;
if (higher == null)
entry = lower;
else if (lower == null)
entry = higher;
else if (Math.abs(lower.getKey() - x) < Math.abs(higher.getkey() - x))
entry = lower;
else
entry = higher;
// entry is the closest match.
if (entry != null && Math.abs(entry - x) < error) {
// found the closest entry within the error
}

这将找到连续范围内的所有条目。

关于用于 float 的 java 哈希码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22630975/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com