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

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

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

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

Q&A

解決済

4回答

2492閲覧

javascript 巨大な整数の足し算について

shinichi0326

総合スコア47

JavaScript

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

0グッド

0クリップ

投稿2017/01/29 12:27

javascript においてparseIntで扱える範囲を超えた整数の足し算をしたいのですが、どなたか良い関数などご教示頂けないでしょうか。

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

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

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

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

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

kei344

2017/01/29 12:29

再現可能なコードや状況をもう少し詳しくお書きください。
shinichi0326

2017/01/29 12:45

今、最大10進数18桁のソロバンで2つの整数を足し算した結果を求めたいのですが、2つのソロバンの初期値を整数に変換してからそれを足し算する方法で、java,ruby,php, python2,python3は上手くいったのですが、javascriptだと、parseIntで足したときに扱える最大値を超えてしまうみたいなので、うまくいきません。ライブラリは使い方がよくわからないので、できれば関数の形でご教示頂けたら幸いです。
kei344

2017/01/29 13:08

すいませんが、このエリアではなく質問文に追記していただけますか?
guest

回答4

0

ベストアンサー

右の桁から順番に足してみた。。。。

JavaScript

1<script language="javascript" type="text/javascript"> 2function Add(A,B) 3{ 4 5 var Result=""; 6 var Kuriage=0; 7 for( var i=0; i<Math.max(A.length,B.length); i++ ) 8 { 9 var a=0; 10 var b=0; 11 if( i < A.length){ 12 a=parseInt(A.substr(-1-i,1)); 13 } 14 if( i < B.length){ 15 b=parseInt(B.substr(-1-i,1)); 16 } 17 Result = ((a+b+Kuriage)%10).toString() + Result; 18 Kuriage = Math.floor((a+b+Kuriage)/10); 19 } 20 return Result; 21}; 22var A= "123456789123456789123456789123456789"; 23var B="112233445566778899112233445566778899112233445566778899112233445566778899"; 24window.confirm(Add(A,B)); 25 26</script>

投稿2017/01/29 13:23

編集2017/01/29 22:31
hikochang

総合スコア648

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

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

hikochang

2017/01/29 13:43

足し算は簡単ですが、引き算はちょっと面倒です。 掛け算も頑張ればできるかもしれませんが、、、、 割り算は勘弁ですね。
shinichi0326

2017/01/29 13:46

こんばんは hikochang さん。私はjavascript,node.js初心者なので、ライブラリの使い方が今一わからないので、hikochang さんの様に初心者にも分かりやすいシンプルな関数の形で回答頂きまして誠にありがとうございます。これからも何か解らないことがありましたら、また宜しくお願い致します。
guest

0

... orz
なんとなく、javascriptの上限って何?って調べてみました。

2の55乗を計算する。(正しい値は 36028797018963968 )

だと思います。
それ以上、だとか?

javascript

1 2<script> 3test( "3602879701896300"); 4test( "36028797018963000"); 5test( "36028797018963968"); 6test( "36028797018963999"); 7test( "360287970189639999999"); 8 function test(value){ 9 value = parseInt(value); 10// console.log(value.toFixed(0)); 11 $("#result").append($("<div>").text(value)); 12 $("#result").append($("<div>").text(value.toFixed(0))); 13 value += 1; 14 $("#result").append($("<div>").text("= +1 ")); 15 16// console.log(value.toFixed(0)); 17 $("#result").append($("<div>").text(value)); 18 $("#result").append($("<div>").text(value.toFixed(0))); 19 $("#result").append($("<div>").text("==================")); 20 } 21 22</script>

ただ、参照記事にあります。
toFixed(0) で誤差なく出ますね。

答えになっていません。

投稿2017/01/29 13:02

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

shinichi0326

2017/01/29 13:23

ご指摘のページは何回か検索してひっかかりました。 恥をしのんでお伺いいたします。今、StringC, StringDという変数にソロバンの初期値の数値を文字列として持っています。 var result = StringC.toFixed(0) + StringD.toFixed(0); とすると、エラーになってしまうので、別の方法を探していたのですが、 var result = parseInt(StringC).toFixed(0) + parseInt(StringD).toFixed(0); にすればよいのでしょうか?  これだと、parseInt(StringC)のところで、ご指摘の数値を超えてしまうと上手くいかないような気がするのですが、愚問でしょうか? 寛大な心でご教示下さい。
guest

0

JavaScriptで扱える整数の最大値は116桁なので18桁になるとNumber型で扱うことが不可能でしょう。
従って、String型にして文字列処理させる必要があります。

JavaScript

1Number.MAX_SAFE_INTEGER; // 9007199254740991

とりあえず、bigInt系ライブラリで数値文字列を引数にとれば要件を満たせそうですが…。
https://www.npmjs.com/package/big-integer

Re: shinichi0326 さん

投稿2017/01/29 13:25

think49

総合スコア18162

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

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

shinichi0326

2017/01/29 13:41

think49さん、こないだも回答ありがとうございます。javascriptもnode.jsも初心者なので、ライブラリの使い方が今一わからないので、関数でご教示くださいとこちらの都合ばかりの質問になってしまってすいません。今回は、hikochangさんがシンプルで分かりやすかったので、そちらをベストアンサーにさせていただきます。いつも回答ありがとうございます。
guest

0

現在はBigIntがあるので、BigInt("123456789056789") + BigInt("9876537890")、または、123456789056789n + 9876537890nのようにすることができますね

投稿2020/07/17 16:52

magf

総合スコア212

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問