JSFiddle - React, Tailwind, and code Playground

by Daniel Cheung

HTML

<p>Decimal to fraction converter emulating a casio calculator</p>
<p>The calculator will attempt to estimate the result after a fixed amount of digits.</p>
<p>The calculator will not display the calculated fraction or continue to calculate the fraction if the denominator > max denominator or the limit of trial of is exceeded</p>
<input id="decimal" type="text">
<pre id="output"></pre>

JavaScript

$(function(){
	var $i = $("#decimal");
  var $o = $("#output");
  $i.on("keyup", function(){
  	var iV = $i.val();
  	$o.text("");
    
    //start evaluation
    if (iV.indexOf(".") > -1) {
      var whole = iV.match(/^(\d*)\.\d*$/)[1] || "0";
      var decimal = iV.match(/^\d*\.(\d*)$/)[1] || "0";
      if (decimal.length > 15) decimal = decimal.substr(0,15);
      var numOfDecimals = decimal.length;
      var maxTrial = 2000;
			var maxDenominator = 10000;
    	if (iV.length >= 12) {
      	//try brute force
        $o.append("used brute force\n");
        var tryDecimal = decimal/Math.pow(10,numOfDecimals);
        var actualVal = tryDecimal;
        var numerator = 0;
        var denominator  = 1;
        var epsilon = 10e-14;
        var delta = 2;
        var updateNumbers = function() {
          delta = numerator/denominator - tryDecimal;
          return Math.abs(delta);
        };
        while (updateNumbers() > epsilon && --maxTrial && denominator <= maxDenominator) {
        	if (delta > epsilon)
          	denominator++;
          else
            numerator++;
        }
        if (numerator == 0)
        	printResult(whole);
        else if (numerator == denominator) {
          printResult(++whole);
        } else if(!maxTrial || denominator > maxDenominator) {
        	printResult(iV, "max trial reached");
        } else
          printResult((whole>0?whole+"/":"")+numerator+"/"+denominator);
      } else if (decimal > 0) {
      	//attempt conversion
        $o.append("used conversion\n");
        var denominator = Math.pow(10, numOfDecimals);
        var numerator = decimal;
        var divisor = hcf(numerator, denominator);
        if (denominator/divisor > maxDenominator)
        	printResult(iV, "divisor > maxDenominator");
        else
          printResult((whole>0?whole+"/":"")+numerator/divisor+"/"+denominator/divisor);
      } else {
        $o.append("simply parsed as integer\n");
      	printResult(parseInt(iV));
      }
    } else...