Итак, у меня есть приложение 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)
Есть ли недостатки, по которым я скучаю? Может быть, даже лучший способ не выстрелить себе в ногу с целым делением?
(с. Я знаю, что этот вопрос граничит с тем, что он ориентирован на обсуждение - но, надеюсь, он содержит достаточно данных, чтобы склоняться к некоторым ответам)