Project

General

Profile

Bug #13420

Integer#{round,floor,ceil,truncate} should always return an integer, not a float

Added by stomar (Marcus Stollsteimer) 17 days ago. Updated 6 days ago.

Status:
Open
Priority:
Normal
Assignee:
-
Target version:
-
[ruby-core:80645]

Description

The current behavior of Integer#{round,floor,ceil,truncate} produces wrong results for large integers.

In the case of a positive precision argument, these methods return the receiver converted to a float, effectively doing the same as to_f.

2.round(1)  # => 2.0

This leads to errors for large integers:

(10**25).round(2).to_i  # => 10000000000000000905969664
(10**400).round(2)      # => Infinity

Mathematically speaking, the value of an integer should not be changed by #round, #floor, #ceil, or #truncate, regardless of the precision (when positive). An integer rounded to e.g. 2 decimal digits is still the same (and exact) integer.

The desired behavior should be to keep precision as high as possible by not needlessly converting to Float.

The provided patch fixes these methods to return self for positive precision argument, similar to the behavior without a specified precision, i.e. precision 0.

0001-Integer-round-floor-ceil-truncate.patch View (7.83 KB) stomar (Marcus Stollsteimer), 04/11/2017 06:31 AM


Related issues

Related to Ruby trunk - Bug #12780: BigDecimal#round returns different types depending on argument Assigned

History

#1 [ruby-core:80649] Updated by nobu (Nobuyoshi Nakada) 17 days ago

Indeed.
And documents?

#2 Updated by stomar (Marcus Stollsteimer) 17 days ago

  • File deleted (0001-Integer-round-floor-ceil-truncate.patch)

#3 [ruby-core:80653] Updated by stomar (Marcus Stollsteimer) 17 days ago

Patch updated to include doc fixes.

#4 Updated by mrkn (Kenta Murata) 16 days ago

  • Related to Bug #12780: BigDecimal#round returns different types depending on argument added

#5 [ruby-core:80815] Updated by stomar (Marcus Stollsteimer) 6 days ago

The patch has been updated to also include doc changes.

Any thoughts on this?

Also available in: Atom PDF