Perl中浮点数看似相等却比较不等,如何正确判断相等性?
关于浮点数“相等性”比较的选择问题
我编写了一段Perl代码,用于将对象存储到文件并从中读取。为了实现与Perl版本无关的存储,我采用了基于JSON的自定义文本表示格式。但在编写自测代码检查加载后的对象与原对象的*“相等性”*时,遇到了意外情况:
DB<14> x $self->time() == $other->time() 0 '' DB<15> x $self->time() 0 4842276.32536854 DB<16> x $other->time() 0 4842276.32536854 DB<17> x $self->time() == $other->time() 0 '' DB<18> x $self->time() - $other->time() 0 '-2.79396772384644e-09'
可见,虽然两个数值的输出看起来完全相同,但它们的内部表示存在细微差异。不过当为两者生成JSON表示时,却没有差异(本次的时间值不同是因为时间在推移;另外字段顺序不同是Perl哈希的特性):
DB<1> x $self->flat 0 '{"time":4842854.29538268,"crc":23407,"use_counter":19}' DB<2> x $other->flat 0 '{"use_counter":19,"crc":23407,"time":4842854.29538268}'
(实际对象更为复杂,此示例足以说明原理;time值来自clock_gettime(CLOCK_MONOTONIC),需引入Time::HiRes qw(clock_gettime CLOCK_MONOTONIC))
现在我想知道:应该简单地将数字作为字符串进行比较(作为临时解决方法),还是使用更复杂的“正确”方案来处理浮点数比较?
内容的提问来源于stack exchange,提问作者U. Windl
相关产品推荐
相关产品推荐

