我正在尝试在 HTML Javascript 中制作一个分数计算器,我需要简化分数我该怎么做?

I am trying to make a Fraction Calculator in HTML Javascript, I need to simplify the fraction how can I do this?

我的计算器的非脚本部分是这样的(包含所有输入):

<body>
    <p class="box">Fraction Calculator</p>
    <input type="number" id="n1">
    <select id="operation">
        <option value="1">X</option>
        <option value="2">/</option>
        <option value="3">+</option>
        <option value="4">-</option>
    </select>
    <input type="number" id="n2">
    <br>
    <input type="number" id="n3">
    <input type="number" id="n4" style="margin-left:37px">
    <br>
    <button style="margin-left:130px"; onClick="document.getElementById('fraction').innerHTML = option()">Go!</button>
    <p id="fraction"></p>
</body>

而我的选项函数是这样的:

function option()
 {
 selection = document.getElementById('operation').value;


 if(selection == "1"){

 a = multiply();
 return a
 }
 else if(selection == "2"){
 b = division();
 return b
 }
 else if(selection == "3"){
 c = addition();
 return c
 }
 else{
 d = subtraction();
 return d
 }
 }

所以我的计算器乘法部分的当前代码是这样的:

 function multiply()
 {
 Number1 = parseInt(document.getElementById("n1").value);
 Number2 = parseInt(document.getElementById("n2").value);
 Number3 = parseInt(document.getElementById("n3").value);
 Number4 = parseInt(document.getElementById("n4").value);


 var topm = Number1 * Number2;
 var botm = Number3 * Number4;
 return topm + "/" + botm; }

所以目前我的计算器可以工作,但是 none 的分数被简化了。我怎样才能简化这些分数? (我对代码还很陌生)谢谢 :) 这是 JSFiddle link:https://jsfiddle.net/Ethang70/npgL3gd9/

为了简化分数,您要做的是计算分母和分子之间的最大公约数,然后用 GCD 将两者相除。

计算 GCD 的一种方法是使用 Eucledian algorithm

Javascript 中的一个实现可能是:

 function gcd(a,b)
 { 
   if (b == 0)
   {
     return a;
   }
   else
   {
     return gcd(b, a % b);
   }
}

然后,当您打印分数时,您可以这样做:

function multiply()
{
  Number1 = parseInt(document.getElementById("n1").value);
  Number2 = parseInt(document.getElementById("n2").value);
  Number3 = parseInt(document.getElementById("n3").value);
  Number4 = parseInt(document.getElementById("n4").value);

  var topm = Number1 * Number2;
  var botm = Number3 * Number4;
  var divisor = gcd(topm, botm);
  topm = topm / divisor;
  botm = botm / divisor;
  return topm + "/" + botm;
}

祝你好运!

如果您愿意使用小型第三方脚本,可以看看 fraction.js。根据@Zyberzero 的回答,它计算非整数的最大公约数,并 return 将其作为字符串的最低分数:

var myNum = 0.5;
var fraction = new Fraction(myNum);
console.log(fraction.toString()); // Returns 1/2

如果结果是一个整数,它将return相同的整数。如果结果包含一个整数,它将return格式为int d/n;所以如果你只想要分数,你可以围绕 space.

不过,这取决于你想降到多低;有一些小数值名义上表示分数,但不能除以您可能想要的 'lowest' 分数。例如,0.3333333333... 表面上代表三分之一,但 fractions.js 会(正确地)return 33/100。在我最近的用例中,我想要特定的低分数,如 1/31/92/3 等(基于 0.330.11 等小数值, 0.66) 所以我写了一个快速而肮脏的 if/else 来给我我想要的较低分数:

var fractionString = fraction.toString();

var singleQuantity = '';

if (fractionString.indexOf(' ') > 0) {
    var quantitySplit = fractionString.split(' ');
    var fractionSplit = quantitySplit[1].split('/');

    singleQuantity = quantitySplit[0] + ' ';
    topFraction = parseInt(fractionSplit[0]);
    bottomFraction = parseInt(fractionSplit[1]);
}

if (bottomFraction == 100) {
    switch (topFraction) {
        case 11 : {
            topFraction = 1;
            bottomFraction = 9;
            break;
        }
        case 33 : {
            topFraction = 1;
            bottomFraction = 3;
            break;
        }
    }
}

if (bottomFraction == 50) {
    switch (topFraction) {
        case 33 : {
            topFraction = 2;
            bottomFraction = 3;
            break;
        }
    }
}