Electrical engine calculations
my two cents : use duck-typing.

@efficiency = efficiency.to_f


... if it quacks like a float, then it is a float. This allows to leverage ruby's awesomeness with things like : 

class EfficiencyProfile 
  def initialize(some_data, value)
    @data = some_data
    @efficiency_value = some_value 
  end

  def to_f 
    @efficiency_value.to_f
  end 
end 

e = EfficiencyProfile.new(some_big_chunk_of_data_about_engine_performance, 42)
ElectricalEngine.new(1,2,e) # would work without a complain


Dynamic typing sure is dangerous, but you have to embrace it if you want to benefit from it. 

Checking the type explicitly is an half-arsed solution, because : 


it is cumbersome, and you will never be as good at it than, say, a C compiler is
it will completely remove the sole benefit from dynamic typing : flexibility.