Ruby Floating Point Math — Проблема с точностью вычисления суммы

Всем доброе утро,

У меня проблемы с математикой с плавающей запятой, и я полностью потерялся в ".to_f", «*100» и «.0»!

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

Моя программа должна делать две вещи:

  1. Суммировать список десятичных знаков, определить, равна ли их сумма точно 1,0
  2. Определить разницу между 1,0 и суммой чисел – установить значение переменной равным точному разница, чтобы сумма была равна 1,0.

Например:

  1. [0,28, 0,55, 0,17] -> в сумме должно быть 1,0, однако я продолжаю получать 1,xxxxxx. Я реализую сумму следующим образом:

    sum = array.inject(0.0){|сумма,х| сумма+ (x*100)} / 100
    
  2. Причина, по которой мне нужна эта функциональность, заключается в том, что я читаю набор десятичных знаков, поступающих из 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. Я могу либо округлить их в меньшую сторону при изложении, либо при этом расчете... Мне все равно.

ОГРОМНОЕ спасибо за помощь!

6
задан Brandon 28 May 2012 в 13:29
поделиться