ruby-units icon indicating copy to clipboard operation
ruby-units copied to clipboard

Values in @@cached_units can adversely affect Unit scalar creation/conversion

Open ethancrawford opened this issue 7 years ago • 0 comments

There appear to be two situations where values (or lack thereof) in @@cached_units seem to adversely affect the scalar values of units that are created or converted.

The issues that have been observed are as follows: Firstly, when creating two identical Units one after the other, the first time, (when the unit type in question is not in the cache), the float value that is passed in is converted to an integer/fixnum scalar value. For example:

(byebug) RubyUnits::Unit.clear_cache
true
(byebug) test = RubyUnits::Unit.new(81.0, 'lbs/acre').scalar
81
(byebug) test.class
Fixnum

However, if we then immediately create another identical Unit, the float value is converted to a Float scalar value.

(byebug) test2 = RubyUnits::Unit.new(81.0, 'lbs/acre').scalar
81.0
(byebug) test2.class
Float

Secondly, this situation also affects the result if the units are converted to the same units after they are created:

(byebug) RubyUnits::Unit.clear_cache
true
(byebug) test = RubyUnits::Unit.new(81.0, 'lbs/acre').convert_to('lbs/acre')
81 lbs/acre
(byebug) test.scalar.class
Rational
(byebug) test2 = RubyUnits::Unit.new(81.0, 'lbs/acre').convert_to('lbs/acre')
81 lbs/acre
(byebug) test2.scalar.class
Float

Furthermore, the scalar above, ending up as a float, loses precision (it is originally passed in as 81.0):

(byebug) test2.scalar
80.99999999999999

I have created some tests which illustrate the issue, which you can see here: https://github.com/olbrich/ruby-units/compare/master...agworld:float-cache-issue

ethancrawford avatar Sep 19 '18 07:09 ethancrawford