質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

3回答

5805閲覧

少数計算が正常に実行されない

LokiTick

総合スコア27

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2017/05/13 02:56

編集2017/05/13 02:58

###前提・実現したいこと
ここに質問したいことを詳細に書いてください
JavaScriptで適正体重等を計算してコンソールボックスに表示しています

###発生している問題・エラーメッセージ

適正体重を少数第二位まで計算する関数をかいたのですが、 関数をよびだして計算すると今回の場合"適正体重まで+9.68kgです"と表示されるよう書いたのですが 何故か"適正体重まで+9.680000000000007kgです"と表示されてしまいます、これを解決したいのでお力添えお願いします。 ソースメモにより具体的な問題を書きましたのそちらも目を通していただけるとありがたく存じます

###該当のソースコード

JavaScript

1var hei = 183; 2var wei = 64; 3// ---適正体重計算 4function idlWei(hei){ 5 var idlWei = Math.pow(hei/100,2) * 22; 6 idlWei = Math.round(idlWei *100)/100; //少数第二位までにまとめる処理 7 8 return idlWei; 9} 10 11console.log("適正体重は" + idlWei(hei) + "kgです"); //ここでは関数は正常に動作し少数第二位までにまとめられている 12 13//---適正体重とのギャップ ここが問題の場所になります 14if(wei < idlWei(hei)){ 15 console.log("適正体重まで+" + (idlWei(hei) - wei) + "kgです"); 16}else if(wei == idlWei(hei)){ 17 console.log("適正体重です"); 18}else{ 19 console.log("適正体重まで-" + (wei -idlWei(hei)) + "kgです"); 20} 21 22// 後述の対策案 ((idlWei(hei)*100-wei*100)/100);

###試したこと
検索したところJavaScriptはIEEEという規格のため誤差で少数が、
今回のようになる場合があるとのことなので一度整数にしてから計算してみましたがほしい結果は得られませんでした、そのさいのコードはソース欄下部にメモしました。
###補足情報(言語/FW/ツール等のバージョンなど)
言語:JavaScript 開発環境:Cloud9 実行環境:Choromeデベロッパツール

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

JavaScriptは標準でprintfが無いので、こういう時は面倒ですね。
100倍したまま文字列化して、途中に小数点を挿入します。
また、表示の直前で丸めるようにします。

JavaScript

1var hei = 183; 2var wei = 64; 3// ---適正体重計算 4function idlWei(hei){ 5 var idlWei = Math.pow(hei/100,2) * 22; 6 return idlWei; 7} 8function round2(v){ //小数第二位までにまとめる処理 9 v = Math.round(v*100) + ""; 10 return v.slice(0,-2) + "." + v.slice(-2); 11} 12 13console.log("適正体重は" + round2(idlWei(hei)) + "kgです"); 14 15if(wei < idlWei(hei)){ 16 console.log("適正体重まで+" + round2(idlWei(hei) - wei) + "kgです"); 17}else if(wei == idlWei(hei)){ 18 console.log("適正体重です"); 19}else{ 20 console.log("適正体重まで-" + round2(wei -idlWei(hei)) + "kgです"); 21}

なお、
× 少数
○ 小数

投稿2017/05/13 03:53

otn

総合スコア84531

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

LokiTick

2017/05/15 01:18 編集

文字列からのアプローチ勉強になりました、ご回答ありがとうございました。 また誤字についての指摘感謝します
guest

0

ベストアンサー

「計算の順序」に問題があるように見受けられますね。
浮動小数点演算は誤差が生まれる為、出来るだけ整数演算した後に10の乗数で除算するのが基本です。

JavaScript

1function calcAverageBodyWeight (height) { 2 return Math.round(height * height * 22 /100) / 100; 3} 4 5alert(calcAverageBodyWeight(183)); // 73.68

Re: LokiTick さん

投稿2017/05/13 10:41

編集2017/05/13 10:41
think49

総合スコア18162

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

LokiTick

2017/05/15 01:17

非常に簡潔かつ、数値の扱いについて勉強になりましたのでBAとさせていただきました、ご回答ありがとうございます。
guest

0

小数点位置が決まっているなら下記のようにすればとりあえず答えは出ると思います。

JavaScript

1var hei = 183; 2var wei = 64; 3// ---適正体重計算 4function idlWei(hei){ 5 var idlWei = Math.pow(hei/100,2) * 22; 6 idlWei = Math.round(idlWei *100)/100; 7 return idlWei; 8} 9function d( a, b ) { 10 return ( Math.round( a * 100 ) - Math.round( b * 100 ) ) /100; 11} 12 13console.log("適正体重は" + idlWei(hei) + "kgです"); 14 15if(wei < idlWei(hei)){ 16 console.log("適正体重まで+" + d( idlWei(hei), wei ) + "kgです"); 17}else if(wei == idlWei(hei)){ 18 console.log("適正体重です"); 19}else{ 20 console.log("適正体重まで-" + d( wei, idlWei(hei) ) + "kgです"); 21}

使用していないので詳しくはわかりませんが、ライブラリが何種類かあります。

【GitHub - MikeMcl/decimal.js: An arbitrary-precision Decimal type for JavaScript】
https://github.com/MikeMcl/decimal.js/

【GitHub - MikeMcl/bignumber.js: A JavaScript library for arbitrary-precision decimal and non-decimal arithmetic】
https://github.com/MikeMcl/bignumber.js/

【GitHub - MikeMcl/big.js: A small, fast JavaScript library for arbitrary-precision decimal arithmetic.】
https://github.com/MikeMcl/big.js/

【GitHub - dtrebbien/BigDecimal.js: Arbitrary-precision decimals library for JavaScript】
https://github.com/dtrebbien/BigDecimal.js/

【bignumber.js vs. big.js vs. decimal.js · jsPerf】
https://jsperf.com/bignumber-js-vs-big-js-vs-decimal-js/29

投稿2017/05/13 03:20

kei344

総合スコア69407

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

LokiTick

2017/05/15 01:19

ライブラリのご紹介と具体的な解決案有難うございました。 今後はライブラリも勉強しようと思います
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問