Map中的浮点数作为键

6
给定一组{价格,数量}对,我需要在相同价格点上汇总所有数量。最简单的方法是什么?
一种不太优雅的解决方案是使用Hashmap实现解决方案,其中键是价格,值是聚合数量。但是据我所知,Float不是Hashmap的安全键。因此,这个解决方案容易出错。
有没有推荐的替代方法来解决这个问题?

4
使用字符串作为键有什么问题? - Aleksandr M
3
定义"价格点"是什么?它是指在某一特定范围内的价格吗?您可以创建一个新类,其中包含一个价格值(我个人会使用BigDecimal),并将价格转换为一定范围内的值,该范围用于确定hashCode。 - Hovercraft Full Of Eels
1
太好了,谢谢!我被问题困扰得太深,没想到这么简单的解决方案。感谢 @AleksandrM。 - Shruti Tiwari
创建一个名为 PricePoint 的类,将目标 float 作为构造函数的参数传入,并将其用作价格桶的锚点。 - Sergey Kalinichenko
在我看来,你永远不应该使用 float(或 Float)来处理任何数据。如果你认为需要使用 float,那么你就需要使用 double。但是,如果你正在处理货币,并且认为需要使用 double,那么你可能需要使用整数类型的数据。 - Solomon Slow
显示剩余2条评论
2个回答

9
你可以使用BigDecimal作为键。这样可以确保hashcode的安全。
你需要初始化值,以便它们具有相同的比例,例如:
BigDecimal key = new BigDecimal(Double.toString(price)).setScale(2);

1
BigDecimal也有精度,因此应该用于金融定点值。尽管冗长且需要小心处理。 - Joop Eggen

2
如果所有价格都有固定的小数位数(例如2位),则可以简单地使用Long作为Map键来表示价格(以分为单位)。
使用BigDecimal是一个不好的选择,因为它可能会导致罕见且难以发现的错误——只有当两个BigDecimal具有相同的值和相同的精度时,它们才相等(因此2.0不等于2.00或2——所有这三个数字将成为映射中的不同键)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接