2016-04-11 4 views
0

НЕРАСПРОСТРАНЕНИЯ скрипта часть моего калькулятора это (со все входами):Я пытаюсь сделать Фракционный калькулятор в HTML Javascript, мне нужно упростить фракцию, как я могу это сделать?

<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 
} 
} 

Так что мой текущий код для моего умножения части Fo моего калькулятора заключается в следующем:

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; } 

В настоящее время мой калькулятор работает, но ни одна из фракций не упрощена. Как я могу упростить эти фракции? (Я прилично новичок в коду) Спасибо :) Вот ссылка JSFiddle: https://jsfiddle.net/Ethang70/npgL3gd9/

+0

Я действительно надеюсь, что вы отступ вашего кода и он GIT потеряли во время загрузки, также включает в себя JSFiddle –

+0

Хорошо это было скопировать странно, в любом случае ссылка JSFiddle была добавлена ​​или здесь (https://jsfiddle.net/Ethang70/npgL3gd9 /) – Ethang70

+0

Возможно просто поиск алгоритма упрощения фракций ... http://www.jstor.org/stable/41187600?seq=1#page_scan_ tab_contents – Aeldred

ответ

0

Для упрощения дроби, что вы делаете, что вы вычислить наибольший общий делитель между числителем и знаменателем, и разделить оба с НОД ,

Одним из способов расчета 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; 
} 

Успехов!

0

Если вы можете использовать небольшой сторонний скрипт, вы можете взглянуть на fraction.js. В соответствии с @ ответ Zyberzero, он вычисляет наибольший общий делитель нецелых и возвращает его в качестве самой низкой фракции он может сделать в виде строки:

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

Если результат целое число, оно будет возвращать то же самое целое число. Если в результате содержит целое число, оно вернется в формате int d/n; поэтому, если вы хотите только фракцию, вы можете разделить ее по всему пространству.

Это зависит от того, как низко вы хотите идти; существуют определенные десятичные значения, которые на самом деле представляют фракции, но не могут быть разделены на «низшую» фракцию, которую вы можете захотеть. Например, 0.3333333333... якобы представляет одну треть, но fractions.js (правильно) вернет 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; 
     } 
    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^