Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby浮点问题_Ruby_Floating Point - Fatal编程技术网

Ruby浮点问题

Ruby浮点问题,ruby,floating-point,Ruby,Floating Point,我有一个系统正在运行一系列计算,出于某种原因,每次0.07出现时,它都显示为0.07000000000000001 我很清楚浮动是近似值,但我编写的代码是这样的: number = '%.2f' % ( num1 - num2 ) number.to_f 尽管如此,0.07000000000000001仍会出现在我的代码中,并最终导致数组排序失败: sort! { |a,b| b <=> a } <-- b equals 0.07000000000000001 an

我有一个系统正在运行一系列计算,出于某种原因,每次0.07出现时,它都显示为0.07000000000000001

我很清楚浮动是近似值,但我编写的代码是这样的:

number = '%.2f' % ( num1 - num2 )
number.to_f
尽管如此,0.07000000000000001仍会出现在我的代码中,并最终导致数组排序失败:

sort! { |a,b| b <=> a }      <-- b equals 0.07000000000000001 and a equals 0.08

排序!{| a,b | b a}所有数字都是有序的,但字符串不能对数字进行有序比较,只能进行相等比较,以确定它们是否是同一对象。(显然,一个总是返回false的比较。)

我想这就是您看到的错误类型,类似于:ArgumentError:将字符串与Float进行比较失败

浮点对象中低阶位的问题可能会干扰排序,尽管引发实际异常的可能性很小。与大多数十进制字符串分数一样,
0.07
在基础浮点格式中没有精确的表示形式。可以想象,获得
0.07
(文字常数与计算结果)的不同方法可能会产生稍微不同的值

但也要注意,如果您试图打印出比实际数量更多的分数位数,您将看到最后一位的各种余数。这些数字可以是非零的,但它们不能告诉您有关数字的任何有用信息


最安全的做法是缩放到整数值,调用
#to_i,
并比较整数。

可以比较整数和浮点数。其中一个肯定是别的东西。您还应该显示什么是
num1-num2
。引发的错误是什么?如果这些值真的和你说的一样,我看不出有什么理由不可以比较,即使漂移在0.07左右。另外,正如@Cthulhu提到的,
round()
可能是消除浮点漂移的更好方法。。。将有一个更新。我想你已经成功了。。。.0700000000001正在转换为字符串。你知道为什么会这样吗?事实上,sawa和mdunsmuir在一小时前就搞定了。如果您给出了实际的错误消息,它可能会立即变得很明显。我无法得到错误,因为Sidekiq没有报告它:(它只提供以下内容:{“重试”=>false,“队列”=>“默认”,“类”=>“排行榜监视器”,“args”=>[],“jid”=>“ff70ecfc6a0437bd6f3a84f8”}2013-02-01T23:05:15+00:00应用程序[worker.1]:2013-02-01T23:05:15Z 2 TID-1h2weo警告:排行榜条目与排行榜条目的比较失败2013-02-01T23:05:15+00:00应用程序[worker.1]:2013-02-01T23:05:15Z 2 TID-1h2weo警告:/app/app/models/leadboard_data.rb:51:in
sort!'2013-02-01T23:05:15+00:00应用程序[worker.1]:/app/app/models/leadboard_data.rb:51:in
sort_by'不是很明显吗?当我在这里看到像你这样的人实际上侮辱了提问者时,这很有趣。。。