Project

General

Profile

Actions

Feature #13420

closed

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

Added by stomar (Marcus Stollsteimer) over 4 years ago. Updated over 4 years ago.

Status:
Closed
Priority:
Normal
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.


Files

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

Related issues

Related to Ruby master - Bug #12780: BigDecimal#round returns different types depending on argumentClosedmrkn (Kenta Murata)Actions
Actions

Also available in: Atom PDF