Issue #13420 has been updated by stomar (Marcus Stollsteimer).


Applied.

I opened a PR for the specs: https://github.com/ruby/spec/pull/436

Should I add a comment in `NEWS` or not?

E.g.

``` diff
diff --git a/NEWS b/NEWS
index 29033dd..4b122ca 100644
--- a/NEWS
+++ b/NEWS
@@ -30,6 +30,8 @@ with all sufficient information, see the ChangeLog file or Redmine
   * Integer.sqrt  [Feature #13219]
   * Integer#step does no longer rescue exceptions when given
     a step value which cannot be compared with #> to 0. [Feature #7688]
+  * Integer##{round,floor,ceil,truncate} now always return an Integer.
+    [Bug #13420]
 
 * IO
 
-- 
```


----------------------------------------
Bug #13420: Integer#{round,floor,ceil,truncate} should always return an integer, not a float
https://bugs.ruby-lang.org/issues/13420#change-64675

* Author: stomar (Marcus Stollsteimer)
* Status: Closed
* Priority: Normal
* Assignee: stomar (Marcus Stollsteimer)
* Target version: 
* ruby -v: r58307
* Backport: 2.2: UNKNOWN, 2.3: UNKNOWN, 2.4: UNKNOWN
----------------------------------------
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)


-- 
https://bugs.ruby-lang.org/

Unsubscribe: <mailto:ruby-core-request / ruby-lang.org?subject=unsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>