如何有效地清除 Ruby 的负零浮点数?
在 Ruby 中,0.0 * -1 == -0.0
。
我有一个应用程序,我将一堆 Float
对象与 -1
相乘,但我不喜欢输出中的 -0.0
,因为这很令人困惑。
有没有一种聪明的方法可以使 Float#to_s
输出 0.0
而不是 -0.0
?
我完全可以通过某种洗涤器/帮助器方法运行每个 Float
对象,但以下内容往往会让我更加困惑:
def clean_output(amount)
if amount.zero?
0.0
else
amount
end
end
更新:
精确地说明我正在寻找的内容,我想要一个可以在一大堆浮点数上运行的解决方案,其中一些是负数,一些是正数。负数应保持负数,除非它们是负零,即 -0.0
。
示例:
clean_output(-0.0) #=> 0.0
clean_output(-3.0) #=> -3.0
clean_output(3.0) #=> 3.0
In Ruby, 0.0 * -1 == -0.0
.
I have an application where I multiply a bunch of Float
objects with -1
, but I don't like the -0.0
in the output, since it's confusing.
Is there a smart way of making Float#to_s
output 0.0
instead of -0.0
?
I'm completely fine with running every Float
object through some kind of scrubber/helper method, but the following just tends to make me even more confused:
def clean_output(amount)
if amount.zero?
0.0
else
amount
end
end
UPDATE:
To be more precise on what I'm looking for, I want a solution that I can run on a whole bunch of floats, some of which will be negative, some positive. The negative ones should remain negative unless they're negative zeroes, i.e. -0.0
.
Examples:
clean_output(-0.0) #=> 0.0
clean_output(-3.0) #=> -3.0
clean_output(3.0) #=> 3.0
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
实际上有一个不需要条件的解决方案。
输出:
实际上,由于缺乏清晰度,我并不比我接受的解决方案更喜欢这个解决方案。如果我在一段不是我自己编写的代码中看到这一点,我会想知道为什么你要向所有内容添加零。
不过它确实解决了问题,所以我想无论如何我都会在这里分享。
There is actually a solution which does not require a condition.
output:
I don't actually like this solution better than the one I accepted, because of lack of clarity. If I'd see this in a piece of code I didn't write myself, I'd wonder why you'd want to add zero to everything.
It does solve the problem though, so I thought I'd share it here anyway.
如果您编写的代码让您感到困惑,那么这应该会让您大吃一惊:
有一些证据:
我不喜欢使用
nonzero?
因为它的用例有点混乱。它是 Numeric 的一部分,但文档显示它用作 Comparable 的一部分,与<=>
运算符一起使用。另外,我宁愿为此目的测试零条件,因为它看起来更简单。而且,虽然 OP 的代码可能看起来很冗长,但这是过早优化没有回报的另一种情况:
结果:
我添加了一个没有
to_s
的版本。这些是在我的笔记本电脑上运行的,这台笔记本电脑已经有几年了,这就是为什么结果时间比以前的测试要高的原因:结果:
找出导致速度减慢的原因
non_zero?
:结果:
If the code you wrote confuses you then this ought to really bend your mind:
With some proof:
I don't like using
nonzero?
because its use-case is a bit confused. It's part of Numeric but the docs show it used as part of Comparable with the<=>
operator. Plus, I'd rather test for a zero condition for this purpose because it seems more straightforward.And, though the OP's code might appear verbose, this is another of those cases where premature optimization doesn't pay off:
And the results:
I added a version without the
to_s
. These were run on my laptop, which is several years old, which is why the resulting times are higher than the previous tests:And the results:
To sort out what was slowing down
non_zero?
:With the results:
我想不出比这更好的了:
但这只是你的解决方案的一个变体。不过,与您不同的是,这个不会更改
value
的类型(例如,如果您传递-0
,它将返回0
) 。但看起来这对你来说并不重要。如果您确定这会让您的代码更简洁,您可以将类似的方法添加到
Numeric
类中(这将使该方法可用于Float
、Fixnum< /code> 和其他数字类):
然后使用它:
这将使处理浮点数组变得更容易:
I can't think of anything better than that:
but that's just a variation of your solution. Though, unlike yours this one doesn't change type of
value
(if, for example, you pass-0
it'll return0
). But looks like it's not important in your case.If you're sure that'll make your code cleaner you can add method like that to
Numeric
class (that will make that method available forFloat
,Fixnum
, and other numeric classes):and then use it:
That will make easier to process an array of floats:
只需检查答案是否为零,然后将abs应用于该值。它将把 -0.0 转换为 0.0
simply just check whether answer is zero then apply abs to the value. It will convert -0.0 into 0.0
对我来说,这段代码的意图更清晰一些,至少在 Ruby 1.9.3 中它比 @the Tin Man 的稍快一些
To me, the intent of this code is a little clearer and at least in Ruby 1.9.3 it's slightly faster than @the Tin Man's