我正在尝试在 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/3
、1/9
、2/3
等(基于 0.33
、0.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;
}
}
}
我的计算器的非脚本部分是这样的(包含所有输入):
<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/3
、1/9
、2/3
等(基于 0.33
、0.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;
}
}
}