Feature #6958

buggy BigDecimal#integer?

Added by Adriano Mitre over 2 years ago. Updated over 2 years ago.

[ruby-core:47386]
Status:Rejected
Priority:Normal
Assignee:Kenta Murata

Description

=begin
BigDecimal#integer? always return false, which is wrong in many cases, as shown below.

x, y = BigDecimal('1'), BigDecimal('1.0')

x.integer?
#=> false

y.integer?
#=> false

x == x.to_i
#=> true

y == y.to_i
#=> true

# Possible workaround
#
class BigDecimal
def integer?
self == self.to_i
end
end
=end

History

#1 Updated by Nobuyoshi Nakada over 2 years ago

  • Tracker changed from Backport to Feature
  • Project changed from Backport192 to Ruby trunk
  • Category changed from lib to lib

Currently BigDecimal does not define #integer? method.
It is Numeric#integer? and returns false always.

Possible options occur to me are:
(1) define BigDecimal#integer?
(2) change Numeric#integer?, like as your workaround.

It might be better to implement (1) together, if (2) is chosen.

#2 Updated by Nobuyoshi Nakada over 2 years ago

  • Description updated (diff)

#3 Updated by Nobuyoshi Nakada over 2 years ago

  • Status changed from Open to Rejected

I was wrong.

Numeric#integer? returns true if the receiver is an instance of integral class, or false.
BigDecimal is not an integral object, so it must return false always, as well as Float.

1.0.integer? #=> false

What you expect is not #integer? method.

#4 Updated by Alex Young over 2 years ago

On 02/09/2012 05:45, nobu (Nobuyoshi Nakada) wrote:

Issue #6958 has been updated by nobu (Nobuyoshi Nakada).

Status changed from Open to Rejected

I was wrong.

Numeric#integer? returns true if the receiver is an instance of integral class, or false.
BigDecimal is not an integral object, so it must return false always, as well as Float.

That's an implementation detail, surely? Mathematically, isn't it true
to say that 1.0 (as understood by BigDecimal) is an integer? If so,
wouldn't a second method, #integral? be better for the case where you
want to know if a numeric is of an integral class?

--
Alex

1.0.integer? #=> false

What you expect is not #integer? method.

Feature #6958: buggy BigDecimal#integer?
https://bugs.ruby-lang.org/issues/6958#change-29134

Author: adrianomitre (Adriano Mitre)
Status: Rejected
Priority: High
Assignee:
Category: lib
Target version:

=begin
BigDecimal#integer? always return false, which is wrong in many cases, as shown below.

x, y = BigDecimal('1'), BigDecimal('1.0')

x.integer?
#=> false

y.integer?
#=> false

x == x.to_i
#=> true

y == y.to_i
#=> true

# Possible workaround
#
class BigDecimal
def integer?
self == self.to_i
end
end
=end

#5 Updated by Nobuyoshi Nakada over 2 years ago

  • Category changed from lib to core
  • Status changed from Rejected to Assigned
  • Assignee set to Kenta Murata
  • Priority changed from High to Normal

Ok, then you want to request a new feature?

#6 Updated by Alex Young over 2 years ago

Sure. I've created #6973 for this, although I've switched the method names around from my suggestion above. I'm guessing there's rather more code relying on #integer?'s current implementation than I'd want to personally fix right now :-)

#7 Updated by Marc-Andre Lafortune over 2 years ago

  • Status changed from Assigned to Rejected

Closing, as it is now covered by feature request #6973

I was also surprised by the fact that .integer? is equivalent to is_a?(Integer). It makes that method completely redundant (and less clear than using is_a?).

Did we ever remove a method in Ruby?

Also available in: Atom PDF