gpt4 book ai didi

ruby - 在 Set 中存储 float ?

转载 作者:太空宇宙 更新时间:2023-11-03 16:34:20 26 4
gpt4 key购买 nike

在Ruby 核心库中,有一个非常有用的Set 类。它可以存储任何类型的对象。

但是如您所知, float (Ruby 中的Float)存在一些准确性问题。 1.2-1.0 不等于 0.2

s = Set.new()
s.add(1.2-1.0)
s.add(0.2)
s.size
=> 2

是的,我可以使用 BigDecimal 类型来获取精确的数字。但是有没有可能给 Set 一个特定的比较函数,让它可以承受一个小错误(例如 1e-9)?

(我知道这个问题与语言无关。欢迎使用其他常见语言的解决方案)

最佳答案

有趣的问题,我想我已经找到了一个潜在的解决方案,具体取决于您想要做什么。 Ruby 在底层使用 Hash 来存储 Set 的元素。在 Ruby 中,Hash 键相等性由方法 hasheql? 定义。因此,如果您在 Float 中重新定义这些方法(买者自负!),您可以使 Set 合理地认为接近的 Float 是相等的:

class Float

def eql?(other)
other.is_a?(Float) && self.round(9) == other.round(9)
end

alias :old_hash :hash

def hash
self.round(9).old_hash
end

end

s = Set.new
s.add(0.2)
s.include?(0.2) # => true
s.include?(1.2 - 1.0) # => true
s.include?(0.2001) # => false

关于ruby - 在 Set 中存储 float ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10161152/

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