Всем доброе утро,
У меня проблемы с математикой с плавающей запятой, и я полностью потерялся в ".to_f", «*100» и «.0»!
Я надеялся, что кто-нибудь сможет помочь мне с моей конкретной проблемой, а также точно объяснит, почему их решение работает, чтобы я понял это в следующий раз.
Моя программа должна делать две вещи:
Например:
[0,28, 0,55, 0,17] -> в сумме должно быть 1,0, однако я продолжаю получать 1,xxxxxx. Я реализую сумму следующим образом:
sum = array.inject(0.0){|сумма,х| сумма+ (x*100)} / 100
Причина, по которой мне нужна эта функциональность, заключается в том, что я читаю набор десятичных знаков, поступающих из Excel. Они не точны на 100% (в них отсутствуют некоторые десятичные точки), поэтому сумма обычно получается из 0,999999xxxxx или 1,000xxxxx. Например, я получу следующие значения:
0,568887955,0,070564759,0,360547286.
Чтобы исправить это, я могу взять сумму первых n-1 чисел, а затем немного изменить конечное число, чтобы сумма всех чисел равнялась 1,0 (должна пройти проверку с использованием приведенного выше уравнения или чего-то еще, что я закончить с). В настоящее время я реализую это следующим образом:
sum = 0.0
array.each do |item|
sum += item * 100.0
end
array[i] = (100 - sum.round)/100.0
Я знаю, что могу сделать это с помощью inject, но пытался поиграть с ним, чтобы увидеть, что работает. Я думаю, что это обычно работает (из проверки вывода), но не всегда соответствует сумме проверки, указанной выше. Так что, если надо, могу и эту подкорректировать. Обратите внимание, что в этих числах мне нужна только точность до двух знаков после запятой, то есть 0,56, а не 0,5623225. Я могу либо округлить их в меньшую сторону при изложении, либо при этом расчете... Мне все равно.
ОГРОМНОЕ спасибо за помощь!