You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 05:15:29