Есть ли недостатки в том, чтобы всегда требовать использования mathn в рельсах? - PullRequest
1 голос
/ 15 марта 2012

Итак, у меня есть приложение rails, которое вычисляло значение рейтинга для статистики бейсбола, и у меня была формула важности, которая включала вычисление «важности», которое выглядело так:

ranking_value.formula.map{|factor| factor[:importance] ? (1/factor[:importance]) : 1}.sum

Как вы можете себе представить, это вернулось и укусило меня позже, потому что фактор [: важность] был целым числом, и я получил неточную сумму - и хотя я пытался быть осторожным в других местах, где я помнил, чтобы бросать делители как числа с плавающей точкой - это заставляет меня беспокоиться, когда я делаю это по линии, естественно ожидая, что деление будет с плавающей точкой.

Итак, я думаю о необходимости mathn в каждом приложении Rails, которое выполняет вычисления, только в моем Rails application.rb или в качестве config / initializer

Ясно, что иногда бывают случаи, когда мне действительно нужны целые числа, но кажется, что лучше потерпеть неудачу на стороне точности и заставить целые числа там, где они мне нужны (например, делать a.div (b), где это необходимо).

Медленнее ли математика? С точки зрения быстрого теста да - но не настолько медленно, чтобы я мог подумать, что возникнет реальная проблема:

require 'benchmark'

puts "----------------\nWithout mathn\n----------------"

n = 100000
Benchmark.bmbm do |x|
  x.report{for i in 1..n; a = 42/8; end}
  x.report{for i in 1..n; a = 42/8.to_f; end}
end

puts "----------------\nWith mathn\n----------------"
require 'mathn'
Benchmark.bmbm do |x|
  x.report{for i in 1..n; a = 42/8; end}
  x.report{for i in 1..n; a = (42/8).to_f; end}
end

Результат:

± ruby test.rb
----------------
Without mathn
----------------
Rehearsal ------------------------------------
   0.010000   0.000000   0.010000 (  0.008576)
   0.020000   0.000000   0.020000 (  0.025659)
--------------------------- total: 0.030000sec

       user     system      total        real
   0.010000   0.000000   0.010000 (  0.008334)
   0.030000   0.000000   0.030000 (  0.023857)
----------------
With mathn
----------------
Rehearsal ------------------------------------
   0.030000   0.000000   0.030000 (  0.034743)
   0.050000   0.000000   0.050000 (  0.051568)
--------------------------- total: 0.080000sec

       user     system      total        real
   0.040000   0.000000   0.040000 (  0.035893)
   0.050000   0.000000   0.050000 (  0.054138)

Есть ли недостатки, по которым я скучаю? Может быть, даже лучший способ не выстрелить себе в ногу с целым делением?

(с. Я знаю, что этот вопрос граничит с тем, что он ориентирован на обсуждение - но, надеюсь, он содержит достаточно данных, чтобы склоняться к некоторым ответам)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...