title: Ruby Floating Point Math - Issue with Precision in Sum Calc
body: <p>Good morning all,</p>
  
  <p>I'm having some issues with floating point math, and have gotten totally lost in ".to_f"'s, "*100"'s and ".0"'s!</p>
  
  <p>I was hoping someone could help me with my specific problem, and also explain exactly why their solution works so that I understand this for next time.</p>
  
  <p>My program needs to do two things:</p>
  
  <ol>
  <li>Sum a list of decimals, determine if they sum to exactly 1.0</li>
  <li>Determine a difference between 1.0 and a sum of numbers - set the value of a variable to the exact difference to make the sum equal 1.0.</li>
  </ol>
  
  <p>For example:</p>
  
  <ol>
  <li><p>[0.28, 0.55, 0.17] -> should sum to 1.0, however I keep getting 1.xxxxxx.  I am implementing the sum in the following fashion:</p>
  
  <pre><code>sum = array.inject(0.0){|sum,x| sum+ (x*100)} / 100
  </code></pre></li>
  <li><p>The reason I need this functionality is that I'm reading in a set of decimals that come from excel.  They are not 100% precise (they are lacking some decimal points) so the sum usually comes out of 0.999999xxxxx or 1.000xxxxx.  For example, I will get values like the following:</p>
  
  <pre><code>0.568887955,0.070564759,0.360547286
  </code></pre></li>
  </ol>
  
  <p>To fix this, I am ok taking the sum of the first n-1 numbers, and then changing the final number slightly so that all of the numbers together sum to 1.0 (must meet validation using the equation above, or whatever I end up with).  I'm currently implementing this as follows:</p>
  
  <pre><code>          sum = 0.0
            array.each do |item|
              sum += item * 100.0
            end
            array[i] = (100 - sum.round)/100.0
  </code></pre>
  
  <p>I know I could do this with inject, but was trying to play with it to see what works.  I think this is generally working (from inspecting the output), but it doesn't always meet the validation sum above.  So if need be I can adjust this one as well.  Note that I only need two decimal precision in these numbers - i.e. 0.56 not 0.5623225.  I can either round them down at time of presentation, or during this calculation... It doesn't matter to me.</p>
  
  <p>Thank you VERY MUCH for your help!</p>