前回のエントリーでは連立1次方程式の解の分数表示、分母の符号処理について冗長なコードを書いてみました。(エレガントな方法ではありませんが・・・。)
https://stuffy.mydns.jp/~gusachan/javascript/SimultaneousEquations.html
今回は、小数係数の取り扱いについて考えてみたいと思います。
function isInteger(w) {
w = parseFloat(w);
return Math.round(w) === w;
}
var getDecimalPointLength = function(number) {
var numbers = String(number).split('.'),
result = 0;
if (numbers[1]) {
result = numbers[1].length;
}
return result;
};
if(!(isInteger(a1) && isInteger(b1) && isInteger(p1))) {
var s1 = getDecimalPointLength(a1);
var t1 = getDecimalPointLength(b1);
var u1 = getDecimalPointLength(p1);
var v1 = Math.max(s1, t1, u1);
var a1 = a1*Math.pow(10, v1);
var b1 = b1*Math.pow(10, v1);
var p1 = p1*Math.pow(10, v1);
}
if(!(isInteger(c1) && isInteger(d1) && isInteger(q1))) {
var s2 = getDecimalPointLength(c1);
var t2 = getDecimalPointLength(d1);
var u2 = getDecimalPointLength(q1);
var v2 = Math.max(s2, t2, u2);
var c1 = c1*Math.pow(10, v2);
var d1 = d1*Math.pow(10, v2);
var q1 = q1*Math.pow(10, v2);
}
var x1= d1*p1-b1*q1, y1 = a1*q1-c1*p1;
var z = a1*d1-b1*c1, z1 = Math.abs(z);
連立方程式の片方、または両方に小数係数が含まれている場合、小数点以下の桁数を取得し、方程式を10の最大桁数のべき乗倍して係数を宣言し直す方法を採りました。
また割り切れない分数の定量化として小数表示併記を追加しました。
参考URL: http://shanabrian.com/web/javascript/get-decimal-point-length.php
http://blog.at-human.com/2016/02/10/js%E6%95%B4%E6%95%B0%E3%81%8B%E3%81%A9%E3%81%86%E3%81%8B%E3%82%92%E5%88%A4%E5%88%A5%E3%81%99%E3%82%8B%E9%96%A2%E6%95%B0%EF%BC%88isinteger%EF%BC%89/