Project

General

Profile

Actions

Bug #18018

closed

Float#floor / truncate sometimes result that is too small.

Added by marcandre (Marc-Andre Lafortune) 4 months ago. Updated 3 months ago.

Status:
Closed
Priority:
Normal
Assignee:
-
Target version:
[ruby-core:104466]

Description

291.4.floor(1) # => 291.4 (ok)
291.4.floor(2) # => 291.39 (not ok)
291.4.floor(3) # => 291.4 (ok)
291.4.floor(4) # => 291.4 (ok)
291.4.floor(5) # => 291.39999 (not ok)
291.4.floor(6) # => 291.4 (ok)

g = f.floor(n), for n > 0 must return the highest float that has the correct properties:

  • g <= f
  • g's decimal string representation has at most n digits

I'll note that floor should be stable, i.e. f.floor(n).floor(n) == f.floor(n) for all f and n.

Same idea for truncate, except for negative numbers (where (-f).truncate(n) == -(f.floor(n)) for positive f).

Noticed by Eustáquio Rangel but posted on the mailing list.

Please do not reply that I need to learn how floats work. Note that example given in doc (0.3/0.1).floor == 2 is not this issue, since 0.3/0.1 #=> 2.9999999999999996

Actions

Also available in: Atom PDF