无法真正管理<float,object>(EDITED)</float,object>的映射

时间:2011-09-20 12:24:45

标签: java floating-point

我有一个

   map<Float,Object>.

我需要像

那样存储valuse

0.01 - &gt; ObjA
0.02 - &gt; ObjB

有时候

0.001 - &gt; ObjA
0.002 - &gt; ObjB(点后三位数)

我觉得这很容易。
但是我注意到当我用浮子计算简单计算时 我有时会得到这样的东西。

0.09998
0.02001 -----代替(0.01,0.02)

我知道漂浮不适合这种用法,所以我尝试过双倍,很明显我得到了一张满满的地图 0.0999999998
0.0200000001
自然。

所以我认为我应该围绕它。但这并不容易,因为我不知道它的大小。

有时应为0.03,有时为0.3 谢谢你的协助。



编辑:感谢所有答案。我认为我的问题是我得到5.00001而不是5。不是我输入5.000001到地图。我想围绕浮子,每次都能达到我能找到的最佳价值。因为它是0.0000000X或0.999999X我觉得应该很容易。但我还没想出来。


6 个答案:

答案 0 :(得分:3)

尝试使用

Map<BigDecimal, Object> 

BigDecimal允许您准确定义浮点值。

答案 1 :(得分:3)

如果你在十进制算术中执行逻辑上“准确”的操作,听起来你可能想要Map<BigDecimal, Object>

或者,您可能需要Map<Integer, Object>,其中0.01将映射到10,0.001将映射到1等。如果没有关于您尝试执行的操作的更多信息,则很难确切知道 - 但使用{{ 1}}或Float作为地图中的关键字可能会在所有情况下给您带来问题。

答案 2 :(得分:1)

如果您想使用准确的值,请使用java.math.BigDecimal而不是Float或Double(API有点模糊)。

答案 3 :(得分:0)

浮点数不能代表所有十进制数。这就是原因。

一个明显的例子是0.1,这个数字不能写在浮点数中,这就是为什么你得到那个数字,这是你的0.1

我的建议?不要使用浮动键作为键,对于单个0.000001,您可能会错过列表中 的内容

答案 4 :(得分:0)

浮点数通常使用绝对或相对容差而不是值: “当浮动在X和Y或X +/- Y之间时,我想要这个对象。”

如果你的情况如此,我建议你尝试另一种方法 - 这是不行的。

答案 5 :(得分:0)

不要使用float(或double,或甚至BigDecimals)作为键。您将遇到意外错误,特别是如果您创建操作键。 如果你想要一个数字用于键,并且你可以处理一些准确度错误,请使用Map并使用原始浮点数* 10000作为键。更好的是,创建一个包装Map的CustomMap类,如果不需要整个Map语义,则只实现put(float key, Object value){ map.put(10000 * key, value)}和get(float)。