title: BigDecimal in JavaScript
body: <p>I'm very new to JavaScript (I come from a Java background) and I am trying to do some financial calculations with small amounts of money.</p>
  
  <p>My original go at this was:</p>
  
  <pre><code>&lt;script type="text/javascript"&gt;
      var normBase = ("[price]").replace("$", "");
      var salesBase = ("[saleprice]").replace("$", "");
      var base;
      if (salesBase != 0) {
          base = salesBase;
      } else {
          base = normBase;
      }
      var per5  = (base - (base * 0.05));
      var per7  = (base - (base * 0.07));
      var per10 = (base - (base * 0.10));
      var per15 = (base - (base * 0.15));
      document.write
          (
          '5% Off: $'  + (Math.ceil(per5  * 100) / 100).toFixed(2) + '&lt;br/&gt;' +
          '7% Off: $'  + (Math.ceil(per7  * 100) / 100).toFixed(2) + '&lt;br/&gt;' +
          '10% Off: $' + (Math.ceil(per10 * 100) / 100).toFixed(2) + '&lt;br/&gt;' +
          '15% Off: $' + (Math.ceil(per15 * 100) / 100).toFixed(2) + '&lt;br/&gt;'
      );
  &lt;/script&gt;
  </code></pre>
  
  <p>This worked well except it always rounded up (<code>Math.ceil</code>). <code>Math.floor</code> has the same issue, and <code>Math.round</code> is also no good for floats.</p>
  
  <p>In Java, I would have avoided the use of floats completely from the get-go, however in JavaScript there does not seem to be a default inclusion of something comparable.</p>
  
  <p>The problem is, all the libraries mentioned are either broken or for a different purpose. The <code>jsfromhell.com/classes/bignumber</code> library is very close to what I need, however I'm having bizarre issues with its rounding and precision... No matter what I set the Round Type to, it seems to decide on its own. So for example, 3.7107 with precision of 2 and round type of <code>ROUND_HALF_UP</code> somehow winds up as 3.72 when it should be 3.71. </p>
  
  <p>I also tried @JasonSmith BigDecimal library (a machined port from Java's BigDecimal), but it seems to be for node.js which I don't have the option of running.</p>
  
  <p>How can I accomplish this using vanilla JavaScript (and be reliable) or is there a modern (ones mentioned above are all years old now) library that I can use that is maintained and is not broken?</p>