web-dev-qa-db-ja.com

分数文字列を10進数に変換しますか?

'3/2'などの分数入力文字列を受け取り、それを文字列'1.5'または数値1.5のいずれかとして10進数に変換できるJavaScript関数を作成しようとしています。

function ratio(fraction) {
    var fraction = (fraction !== undefined) ? fraction : '1/1',
    decimal = ??????????;
    return decimal;
});

これを行う方法はありますか?

24
ryanve

まだ誰もそれについて言及していないので、迅速で汚い解決策があります:

var decimal = eval(fraction); 

これには、あらゆる種類の数学文字列を正しく評価するという利点があります。

eval("3/2")    // 1.5
eval("6")      // 6
eval("6.5/.5") // 13, works with decimals (floats)
eval("12 + 3") // 15, you can add subtract and multiply too

ここの人々は生の評価を使用することの危険性についてすぐに言及しますが、私は怠惰な男の答えとしてこれを提出します。

43
Akinos

これを行うために必要な最低限のコードは次のとおりです。

var a = "3/2";
var split = a.split('/');
var result = parseInt(split[0], 10) / parseInt(split[1], 10);
alert(result); // alerts 1.5

JsFiddle: http://jsfiddle.net/XS4VE/

考慮事項:

  • ゼロ除算
  • ユーザーが分数の代わりに整数、またはその他の無効な入力を入力した場合
  • 丸めの問題(たとえば1/3など)
17
Matt Greer

このようなもの:

bits = fraction.split("/");
return parseInt(bits[0],10)/parseInt(bits[1],10);
6
Coomie

私はそれを行うためにNice関数を作成しました。すべてがこの質問と回答に基づいていましたが、文字列を受け取り、10進値を出力しますが、エラーなしで整数も出力します。

https://Gist.github.com/drifterz28/697144

function toDeci(fraction) {
    fraction = fraction.toString();
    var result,wholeNum=0, frac, deci=0;
    if(fraction.search('/') >=0){
        if(fraction.search('-') >=0){
            wholeNum = fraction.split('-');
            frac = wholeNum[1];
            wholeNum = parseInt(wholeNum,10);
        }else{
            frac = fraction;
        }
        if(fraction.search('/') >=0){
            frac =  frac.split('/');
            deci = parseInt(frac[0], 10) / parseInt(frac[1], 10);
        }
        result = wholeNum+deci;
    }else{
        result = fraction
    }
    return result;
}

/* Testing values / examples */
console.log('1 ',toDeci("1-7/16"));
console.log('2 ',toDeci("5/8"));
console.log('3 ',toDeci("3-3/16"));
console.log('4 ',toDeci("12"));
console.log('5 ',toDeci("12.2"));
5
E-comm

整数、混合分数(Unicodeの下品な分数文字を含む)、および小数を処理するために使用する関数があります。おそらく多少の磨きが必要ですが、それは私の目的(レシピの材料リストの解析)には機能します。

入力"2 1/2""2½""2 ½"、および"2.5"は、すべて2.5を返します。例:

var numQty = require("numeric-quantity");

numQty("1 1/4") === 1.25;  // true
numQty("3 / 4") === 0.75;  // true
numQty("¼" ) === 0.25;     // true
numQty("2½") === 2.5;      // true
numQty("¾") === 0.75;      // true
numQty("⅓") === 0.333;     // true
numQty("⅔") === 0.667;     // true

処理されないものの1つは、分数内の小数です。 "2.5 / 5"

3
Jake Boone

遅すぎますが、役立つ場合があります。

evalの代わりにArray.prototype.reduceを使用できます https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce

ES6

const fractionStrToDecimal = str => str.split('/').reduce((p, c) => p / c);
console.log(fractionStrToDecimal('1/4/2')); // Logs 0.125
console.log(fractionStrToDecimal('3/2')); // Logs 1.5

CJS

function fractionStrToDecimal(str) {
  return str.split('/').reduce((p, c) => p / c);
}
console.log(fractionStrToDecimal('1/4')); // Logs 0.25

[編集]レデューサーの初期値を削除し、関数が1より大きい分子に対して機能するようになりました。ありがとう、JamesFurey。

2

外部ライブラリを使用してもかまわない場合は、 math.js に、分数を小数に変換したり、分数の算術演算を実行したりするための便利な関数がいくつか用意されています。

console.log(math.number(math.fraction("1/3"))); //returns 0.3333333333333333
console.log(math.fraction("1/3") * 9) //returns 3
<script src="https://cdnjs.cloudflare.com/ajax/libs/mathjs/3.20.1/math.js"></script>
1
Alfred Waligo

これも機能します:

let y = "2.9/59"
let a = y.split('')
let b = a.splice(a.indexOf("/"))
console.log(parseFloat(a.join('')))
a = parseFloat(a.join(''))
console.log(b)
let c = parseFloat(b.slice(1).join(''))
let d = a/c
console.log(d) // Answer for y fraction
0
Muks123

Eval()メソッドで動作しますが、parseFloatメソッドを使用できます。いいと思います!残念ながら、それはその種の値でのみ機能します-「5/8」ではなく「12.2」ですが、計算で処理できるので、これは良いアプローチだと思います!

0

文字列から答えを取得するだけでなく、結果を分数として使用したい場合は、 https://github.com/infusion/Fraction.js のようなライブラリが非常にうまく機能します。

var f = new Fraction("3/2");
console.log(f.toString()); // Returns string "1.5"
console.log(f.valueOf()); // Returns number 1.5

var g = new Fraction(6.5).div(.5);
console.log(f.toString()); // Returns string "13"
0
Robert Eisele
const fractionStringToNumber = s => s.split("/").map(s => Number(s)).reduce((a, b) => a / b);

console.log(fractionStringToNumber("1/2"));
console.log(fractionStringToNumber("1/3"));
console.log(fractionStringToNumber("3/2"));
console.log(fractionStringToNumber("3/1"));
console.log(fractionStringToNumber("22/7"));
console.log(fractionStringToNumber("355 / 113"));
console.log(fractionStringToNumber("8/4/2"));

console.log(fractionStringToNumber("3")); // => 3, not "3"
0
nonopolarity

機能(ES6):

function fractionToDecimal(fraction) {
  return fraction
    .split('/')
    .reduce((numerator, denominator, i) =>
      numerator / (i ? denominator : 1)
    );
}

機能(ES6、要約):

function fractionToDecimal(f) {
  return f.split('/').reduce((n, d, i) => n / (i ? d : 1));
}

例:

fractionToDecimal('1/2');     // 0.5
fractionToDecimal('5/2');     // 2.5
fractionToDecimal('1/2/2');   // 0.25
fractionToDecimal('10/5/10'); // 0.2
fractionToDecimal('0/1');     // 0
fractionToDecimal('1/0');     // Infinity
fractionToDecimal('cat/dog'); // NaN
0
James Furey

mDNによるより安全なeval()

const safeEval = (str) => {
   return Function('"use strict";return (' + str + ")")();
}

safeEval("1 1/2") // 1.5

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/eval#Do_not_ever_use_eval

0
AverageChau

分数を小数に変換するには、上の数値を下の数値で割るだけです。 5を3で割ると、5/3または1.67になります。よく似ています:

function decimal(top,bottom) {
    return (top/bottom)
}

これがお役に立てば幸いです、ハハ

0
DDPWNAGE

読みやすさから、デバッグの観点から、これは従うのが簡単かもしれません:

// i.e. '1/2' -> .5
// Invalid input returns 0 so impact on upstream callers are less likely to be impacted
function fractionToNumber(fraction = '') {
    const fractionParts = fraction.split('/');
    const numerator = fractionParts[0] || '0';
    const denominator = fractionParts[1] || '1';
    const radix = 10;
    const number = parseInt(numerator, radix) / parseInt(denominator, radix);
    const result = number || 0;

    return result;
}
0

また、パーティーには少し遅れていますが、セキュリティの問題が少ないeval()の代わりに(少なくともMDNによれば)Function()ファクトリがあります。

_var fraction = "3/2";
console.log( Function("return (" + fraction + ");")() );
_

これにより、結果「1.5」がコンソールに出力されます。

補足として: 1 1/2のような混合分数は、eval()でも、Function()で記述されたソリューションでも機能しません。スペース。

0
Canis