JavaScript簡易関数電卓のHTML+JavaScriptソース(テキストのみバージョン)

下のソースを、HTMLファイルの中身にそっくりそのままコピーペーストすれば動くと思います。
改造もご自由にどうぞ。ただし、何かあっても自己責任で解決をお願いします。
※下記プログラムソースについて、ホームページ、ブログ、書籍、雑誌等への二次転載は行わないでください。



<script Language="JavaScript">
<!--
//★使用する変数一覧
enho = ""; //入力された演算方法
menh = ""; //記憶された演算方法
mn1 = ""; //記憶された数値1(演算フラグ用)
mn2 = ""; //記憶された数値2(実際に演算に使用)
exn = ""; //表示されている数値代入用
nen = 0; //新たに表示する数値代入用
memo = 0; //メモリー

//★クリアボタンの処理
function clearen(cn){

	//"C"が押された場合
	if (cn == "clear") {
		enho = ""; //入力された演算方法
		menh = ""; //記憶された演算方法
		mn1 = ""; //記憶された数値1(演算フラグ用)
		mn2 = ""; //記憶された数値2(実際に演算に使用)
		exn = ""; //表示されている数値代入用
		nen = 0; //新たに表示する数値代入用
		document.forms.CALC_FORM.SEG.value = 0;
	}

	//"CE"が押された場合
	if (cn == "sclear") {
		document.forms.CALC_FORM.SEG.value = 0;
	}
	
	//サブ表示欄に数値コピー
	sub_seg_copy();

}

//★数字や小数点が入力された場合の処理
function suji(numb){

	//演算があった直後の場合の処理
	if (mn1 != "") {
		//記憶されている変数を移して、同じ処理が繰り返されないようにする。
		mn2 = mn1;
		mn1 = "";
		document.forms.CALC_FORM.SEG.value = 0;
	}

	exn = '' + document.forms.CALC_FORM.SEG.value;
	numb = '' + numb;

	//表示されている数字がゼロで'.'以外が入力された場合には、nullに変換の上に処理
	if ((exn == "0") && (numb != '.')){
		exn = "";
	}

	//表示されている数字に小数点があり、さらに小数点が入力された場合には、numbをクリアにして、小数点を2つ以上にしない。
	if ((Math.floor(exn) != exn) && (numb == '.')){
		numb = "";
	}

	//新たに表示される数字は、もともと表示されていた数字+入力された数字
	nen = "" + exn + numb;
	document.forms.CALC_FORM.SEG.value = nen;
	
	//サブ表示欄に数値コピー
	sub_seg_copy();
}

//★演算の場合の処理
function enzan(enho){

	//計算に必要な数値を変数に代入
	exn = document.forms.CALC_FORM.SEG.value;
	
	//演算があった直後の場合の処理
	if (mn1 != "") {
		//記憶されている変数を移して、同じ処理が繰り返されないようにする。
		mn2 = mn1;
		mn1 = "";
		//document.forms.CALC_FORM.SEG.value = 0;
	}

	//演算処理(四則演算とべき乗)
	if (menh == "tasu") {
		nen = Math.floor((parseFloat(mn2) + parseFloat(exn)) *1000000000000 + 0.5)/1000000000000; //1e-12未満の位を四捨五入
		document.forms.CALC_FORM.SEG.value = nen;
	}
	if (menh == "hiku") {
		nen = Math.floor((mn2 - exn) *1000000000000 + 0.5)/1000000000000; //1e-12未満の位を四捨五入
		document.forms.CALC_FORM.SEG.value = nen;
	}
	if (menh == "kakeru") {
		nen = Math.floor(mn2 * exn *1000000000000 + 0.5)/1000000000000; //1e-12未満の位を四捨五入
		document.forms.CALC_FORM.SEG.value = nen;
	}
	if (menh == "waru") {
		nen = Math.floor((mn2 / exn) *1000000000000 + 0.5)/1000000000000; //1e-12未満の位を四捨五入
		document.forms.CALC_FORM.SEG.value = nen;
	}
	if (menh == "bekijou") {
		nen = Math.floor(Math.pow(mn2,exn) *1000000000000 + 0.5)/1000000000000; //1e-12未満の位を四捨五入
		document.forms.CALC_FORM.SEG.value = nen;
	}

	//演算方法を変数に代入して記憶させる
	menh = enho;

	//現時点で表示されている数字を変数に格納する
	mn1 = document.forms.CALC_FORM.SEG.value;

	//サブ表示欄に数値コピー
	sub_seg_copy();

}


//★メモリー演算の処理
function memoen(mnb){

	//演算があった直後の場合の処理
	if (mn1 != "") {
		//記憶されている変数を移して、同じ処理が繰り返されないようにする。
		mn2 = mn1;
		mn1 = "";
		//document.forms.CALC_FORM.SEG.value = 0;
	}

	//"MC"が押された場合
	if (mnb == "mc") {
		memo = 0;
		document.forms.CALC_FORM.MEMORY.value = "";
	}

	//"MR"が押された場合
	if (mnb == "mr") {
		document.forms.CALC_FORM.SEG.value = document.forms.CALC_FORM.MEMORY.value;
	}

	//"MS"が押された場合
	if (mnb == "ms") {
		memo = parseFloat(document.forms.CALC_FORM.SEG.value);
		document.forms.CALC_FORM.MEMORY.value = memo;
	}

	//"M+"が押された場合
	if (mnb == "mp") {
		memo = parseFloat(document.forms.CALC_FORM.MEMORY.value) + parseFloat(document.forms.CALC_FORM.SEG.value);
		document.forms.CALC_FORM.MEMORY.value = memo;		
	}
	
	//サブ表示欄に数値コピー
	sub_seg_copy();
	
}

//★その他の機能の処理
function kinou(knb){

	//"+/-"が押された場合(正負変換)
	if (knb == "puramai") {
		document.forms.CALC_FORM.SEG.value = -document.forms.CALC_FORM.SEG.value;
	}

	//"√"が押された場合(平方根)
	if (knb == "heihoukon") {
		document.forms.CALC_FORM.SEG.value = Math.sqrt(document.forms.CALC_FORM.SEG.value);
	}

	//"%"が押された場合(パーセント)
	if (knb == "percent") {
		document.forms.CALC_FORM.SEG.value = mn2 * document.forms.CALC_FORM.SEG.value / 100;
	}

	//"1/x"が押された場合(逆数)
	if (knb == "gyakusu") {
		document.forms.CALC_FORM.SEG.value = (1/document.forms.CALC_FORM.SEG.value);
	}
	
	//"x^2"が押された場合(2乗)
	if (knb == "nijou") {
		document.forms.CALC_FORM.SEG.value = Math.floor(Math.pow(document.forms.CALC_FORM.SEG.value,2)*1000000000000 + 0.5)/1000000000000; //1e-12未満の位を四捨五入
	}

	//"x^3"が押された場合(3乗)
	if (knb == "sanjou") {
		document.forms.CALC_FORM.SEG.value = Math.floor(Math.pow(document.forms.CALC_FORM.SEG.value,3)*1000000000000 + 0.5)/1000000000000; //1e-12未満の位を四捨五入
	}

	//"Exp"が押された場合(指数関数)
	if (knb == "shisukansu") {
		document.forms.CALC_FORM.SEG.value = Math.exp(document.forms.CALC_FORM.SEG.value);
	}
	
	//"ln"が押された場合(自然対数)
	if (knb == "shizentaisu") {
		document.forms.CALC_FORM.SEG.value = Math.log(document.forms.CALC_FORM.SEG.value);
	}

	//"log"が押された場合(常用対数)
	if (knb == "jouyoutaisu") {
		document.forms.CALC_FORM.SEG.value = Math.log(document.forms.CALC_FORM.SEG.value) * Math.LOG10E;
	}

	//"sin"が押された場合(サイン)
	if (knb == "sin") {
		if (document.forms.CALC_FORM.KAKUDO[0].checked) {
			kaku = document.forms.CALC_FORM.SEG.value / 180 * Math.PI;
		}
		if (document.forms.CALC_FORM.KAKUDO[1].checked) {
			kaku = document.forms.CALC_FORM.SEG.value;
		}
		if (document.forms.CALC_FORM.KAKUDO[2].checked) {
			kaku = document.forms.CALC_FORM.SEG.value / 200 * Math.PI;
		}
		document.forms.CALC_FORM.SEG.value = Math.floor(Math.sin(kaku)*1000000000000 + 0.5)/1000000000000; //1e-12未満の位を四捨五入
	}
	
	//"cos"が押された場合(コサイン)
	if (knb == "cos") {
		if (document.forms.CALC_FORM.KAKUDO[0].checked) {
			kaku = document.forms.CALC_FORM.SEG.value / 180 * Math.PI;
		}
		if (document.forms.CALC_FORM.KAKUDO[1].checked) {
			kaku = document.forms.CALC_FORM.SEG.value;
		}
		if (document.forms.CALC_FORM.KAKUDO[2].checked) {
			kaku = document.forms.CALC_FORM.SEG.value / 200 * Math.PI;
		}
		document.forms.CALC_FORM.SEG.value = Math.floor(Math.cos(kaku)*1000000000000 + 0.5)/1000000000000; //1e-12未満の位を四捨五入
	}

	//"tan"が押された場合(タンジェント)
	if (knb == "tan") {
		if (document.forms.CALC_FORM.KAKUDO[0].checked) {
			kaku = document.forms.CALC_FORM.SEG.value / 180 * Math.PI;
		}
		if (document.forms.CALC_FORM.KAKUDO[1].checked) {
			kaku = document.forms.CALC_FORM.SEG.value;
		}
		if (document.forms.CALC_FORM.KAKUDO[2].checked) {
			kaku = document.forms.CALC_FORM.SEG.value / 200 * Math.PI;
		}
		document.forms.CALC_FORM.SEG.value = Math.floor(Math.tan(kaku)*1000000000000 + 0.5)/1000000000000; //1e-12未満の位を四捨五入
	}
	
	//"asin"が押された場合(アークサイン)
	if (knb == "asin") {
		kaku = Math.asin(document.forms.CALC_FORM.SEG.value)
		if (document.forms.CALC_FORM.KAKUDO[0].checked) {
			kaku = kaku / Math.PI * 180;
		}
		if (document.forms.CALC_FORM.KAKUDO[1].checked) {
		}
		if (document.forms.CALC_FORM.KAKUDO[2].checked) {
			kaku = kaku / Math.PI * 200;
		}
		document.forms.CALC_FORM.SEG.value = kaku;
	}

	//"acos"が押された場合(アークコサイン)
	if (knb == "acos") {
		kaku = Math.acos(document.forms.CALC_FORM.SEG.value)
		if (document.forms.CALC_FORM.KAKUDO[0].checked) {
			kaku = kaku / Math.PI * 180;
		}
		if (document.forms.CALC_FORM.KAKUDO[1].checked) {
		}
		if (document.forms.CALC_FORM.KAKUDO[2].checked) {
			kaku = kaku / Math.PI * 200;
		}
		document.forms.CALC_FORM.SEG.value = kaku;
	}

	//"atan"が押された場合(アークタンジェント)
	if (knb == "atan") {
		kaku = Math.atan(document.forms.CALC_FORM.SEG.value)
		if (document.forms.CALC_FORM.KAKUDO[0].checked) {
			kaku = kaku / Math.PI * 180;
		}
		if (document.forms.CALC_FORM.KAKUDO[1].checked) {
		}
		if (document.forms.CALC_FORM.KAKUDO[2].checked) {
			kaku = kaku / Math.PI * 200;
		}
		document.forms.CALC_FORM.SEG.value = kaku;
	}

	//"PI"が押された場合(円周率)
	if (knb == "pai") {
		document.forms.CALC_FORM.SEG.value = Math.PI;
	}

	//"10to2"が押された場合(10進数→2進数変換)
	if (knb == "10to2") {
		str = eval(document.forms.CALC_FORM.SEG.value);
		document.forms.CALC_FORM.HENKAN.value = str.toString(2);
	}

	//"10to8"が押された場合(10進数→8進数変換)
	if (knb == "10to8") {
		str = eval(document.forms.CALC_FORM.SEG.value);
		document.forms.CALC_FORM.HENKAN.value = str.toString(8);
	}

	//"10to16"が押された場合(10進数→16進数変換)
	if (knb == "10to16") {
		str = eval(document.forms.CALC_FORM.SEG.value);
		document.forms.CALC_FORM.HENKAN.value = str.toString(16);
	}

	//"2to10"が押された場合(2進数→10進数変換)
	if (knb == "2to10") {
		str = document.forms.CALC_FORM.HENKAN.value;
		nen = parseInt(str,2);
		document.forms.CALC_FORM.SEG.value = nen;
	}
	
	//"8to10"が押された場合(8進数→10進数変換)
	if (knb == "8to10") {
		str = document.forms.CALC_FORM.HENKAN.value;
		nen = parseInt(str,8);
		document.forms.CALC_FORM.SEG.value = nen;
	}
	
	//"16to10"が押された場合(16進数→10進数変換)
	if (knb == "16to10") {
		str = document.forms.CALC_FORM.HENKAN.value;
		nen = parseInt(str,16);
		document.forms.CALC_FORM.SEG.value = nen;
	}
	
	//サブ表示欄に数値コピー
	sub_seg_copy();

}

//★統計計算の処理
function toukei(tnb){

	data_all = document.forms.CALC_FORM.TDATA.value;
	data_all = data_all.replace(/ /g,','); //空白をカンマに置換
	data_all = data_all.replace(/\n/g,','); //改行をカンマに置換
	data_all = data_all.replace(/\t/g,','); //タブをカンマに置換
	data_all = data_all.replace(/,,,/g,','); //複数カンマをカンマ一つに置換(1)
	data_all = data_all.replace(/,,/g,','); //複数カンマをカンマ一つに置換(2)
	myArray = new Array(); //配列オブジェクトの作成(生データ用)
	myArray = data_all.split(','); //データをカンマで分割して、配列に代入
	leng1 = myArray.length; //データの要素数(空データも要素に含む)
	myArray2 = new Array(); //配列オブジェクトの作成(加工データ用)
	counter = 0; //標本数カウンタ
	sumup = 0; //合計値
	minvl = ""; //最小値
	maxvl = ""; //最大値
	for(i=0; i<leng1; i++){
		if (myArray[i] != "") { //生データが空欄でない場合
			myArray2[counter] = parseFloat(myArray[i]); //加工データ用の配列に代入
			if ((minvl=="")||(parseFloat(myArray[i]) < minvl)) { 
				minvl = parseFloat(myArray[i]); //最小値として代入
			}
			if ((maxvl=="")||(parseFloat(myArray[i]) > maxvl)) { 
				maxvl = parseFloat(myArray[i]); //最大値として代入
			}
			sumup = sumup + parseFloat(myArray[i]); //合計値加算
			counter = counter + 1; //標本数カウンタ追加
		}
	}
	
	document.forms.CALC_FORM.TDATA.value = myArray2; //データの再表示(スペース、改行や空白データ修正済み)
	
	//標本数が押された場合
	if (tnb == "hyouhonsu") {
		document.forms.CALC_FORM.SEG.value = counter;
	}

	//合計値が押された場合
	if (tnb == "goukei") {
		document.forms.CALC_FORM.SEG.value = sumup;
	}
	
	//平均値が押された場合
	if (tnb == "heikin") {
		document.forms.CALC_FORM.SEG.value = sumup / counter;
	}
	
	//分散が押された場合
	if (tnb == "bunsan") {
		bunsancounter = 0;
		bunsanchi = 0;
		for(i=0; i<counter; i++){
			bunsancounter = bunsancounter + Math.pow((myArray2[i] - sumup / counter),2);
		}
		bunsanchi = bunsancounter / counter;
		document.forms.CALC_FORM.SEG.value = bunsanchi;
	}
	
	//標準偏差が押された場合
	if (tnb == "hyouzyunhensa") {
		bunsancounter = 0;
		bunsanchi = 0;
		hyouzyunhensachi = 0;
		for(i=0; i<counter; i++){
			bunsancounter = bunsancounter + Math.pow((myArray2[i] - sumup / counter),2);
		}
		bunsanchi = bunsancounter / counter;
		hyouzyunhensachi = Math.sqrt(bunsanchi);
		document.forms.CALC_FORM.SEG.value = hyouzyunhensachi;
	}	
	
	//最小値が押された場合
	if (tnb == "saishou") {
		document.forms.CALC_FORM.SEG.value = minvl;
	}
	
	//最大値が押された場合
	if (tnb == "saidai") {
		document.forms.CALC_FORM.SEG.value = maxvl;
	}
	
	//サブ表示欄に数値コピー
	sub_seg_copy();
	
}

//★計算欄→サブ表示コピー
function sub_seg_copy() {
	document.forms.CALC_FORM.SUB_SEG.value = document.forms.CALC_FORM.SEG.value;
}
//-->
</script>

<!---->

<!-- ★HTML -->
<!-- ★下記の各項目を切り取り&貼り付けして順番を変えることで、レイアウトの変更ができます。 -->

<form action="" id="CALC_FORM" method="get">

<!-- ★計算欄 -->
<input type="text" id="SEG" value="0" size="32" onChange="sub_seg_copy()"> 計算欄<br>

<!-- ★角度の形式指定 -->
<input type="radio" name="KAKUDO" value="DEG" checked>Deg <input type="radio" name="KAKUDO" value="RAD">Rad <input type="radio" name="KAKUDO" value="GRAD">Grad<br>

<br>

<!-- ★クリア、数字、四則演算 -->
<a href="javascript:clearen('clear')">C</a> <a href="javascript:clearen('sclear')">CE</a> <br>
<a href="javascript:suji('1')">1</a> <a href="javascript:suji('2')">2</a> <a href="javascript:suji('3')">3</a> <a href="javascript:suji('4')">4</a> <a href="javascript:suji('5')">5</a> <a href="javascript:suji('6')">6</a> <a href="javascript:suji('7')">7</a> <a href="javascript:suji('8')">8</a> <a href="javascript:suji('9')">9</a> <a href="javascript:suji('0')">0</a> <a href="javascript:suji('.')">.</a> <br>

<a href="javascript:enzan('tasu')">+</a> <a href="javascript:enzan('hiku')">-</a> <a href="javascript:enzan('kakeru')">×</a> <a href="javascript:enzan('waru')">÷</a> <a href="javascript:enzan('equal')">=</a> <br>

<br>

<!-- ★関数 -->
<a href="javascript:kinou('puramai')">+/-</a> <a href="javascript:kinou('heihoukon')">√</a> <a href="javascript:kinou('percent')">%</a> <a href="javascript:kinou('gyakusu')">1/x</a> <a href="javascript:kinou('nijou')">x^2</a> <a href="javascript:kinou('sanjou')">x^3</a> <a href="javascript:enzan('bekijou')">x^y</a> <a href="javascript:kinou('shisukansu')">Exp</a> <a href="javascript:kinou('shizentaisu')">ln</a> <a href="javascript:kinou('jouyoutaisu')">log</a> <a href="javascript:kinou('sin')">sin</a> <a href="javascript:kinou('cos')">cos</a> <a href="javascript:kinou('tan')">tan</a> <a href="javascript:kinou('asin')">asin</a> <a href="javascript:kinou('acos')">acos</a> <a href="javascript:kinou('atan')">atan</a> <a href="javascript:kinou('pai')">PI</a> <br>

<br>

<!-- ★メモリー -->
<input type="text" id="MEMORY" value=""> メモリー<br>
<a href="javascript:memoen('mc')">MC</a> <a href="javascript:memoen('mr')">MR</a> <a href="javascript:memoen('ms')">MS</a> <a href="javascript:memoen('mp')">M+</a> <br>

<br>

<!-- ★進数変換 -->
<input type="text" id="HENKAN" value=""> 進数変換<br>
<a href="javascript:kinou('10to2')">10to2</a> <a href="javascript:kinou('10to8')">10to8</a> <a href="javascript:kinou('10to16')">10to16</a>  計算欄->進数変換<br>
<a href="javascript:kinou('2to10')">2to10</a> <a href="javascript:kinou('8to10')">8to10</a> <a href="javascript:kinou('16to10')">16to10</a>  進数変換->計算欄<br>

<br>

<!-- ★統計値演算 -->
データ入力欄(カンマ区切り例: 123,1,-45,3.442…)<br>
<textarea cols="32" rows="2" id="TDATA"></textarea><br>
<a href="javascript:toukei('hyouhonsu')">標本数</a> <a href="javascript:toukei('goukei')">合計値</a> <a href="javascript:toukei('heikin')">平均値</a> <a href="javascript:toukei('bunsan')">分散</a> <a href="javascript:toukei('hyouzyunhensa')">標準偏差</a> <a href="javascript:toukei('saishou')">最小値</a> <a href="javascript:toukei('saidai')">最大値</a> <br>

<br>

<!-- ★サブ表示 -->
<input type="text" id="SUB_SEG" value="0" size="32" readonly> サブ表示欄<br>
<script Language="JavaScript">
<!--
document.forms.CALC_FORM.SUB_SEG.style.backgroundColor = "#cccccc";
//-->
</script>

<br>

</form>

<!-- ★説明 -->
※演算の優先順位は、入力順となっています。例: "1 + 2 × 3 ="と計算した場合には、"9"という結果になります。<br>
※使用しているブラウザによって、演算精度が異なります。最後の桁の後にある指数までご確認ください。<br>
※n進数から10進数への変換は整数のみです。<br>
<br>


JavaScript簡易関数電卓ホームに戻る

Copyright (C) 2008 KUNISAN.JP. All Rights Reserved.