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

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

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

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

Q&A

解決済

3回答

3107閲覧

JSの大きい数の扱い

onioni22

総合スコア17

JavaScript

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

0グッド

3クリップ

投稿2019/03/15 14:04

JSで大きい数の剰余を求めようとしたとき、

>11**16 45949729863572160 >11**16%33 0

となってしまい、正しい剰余が求められません。(11**16=45949729863572161)
どうすれば大きい数の正しい剰余を求められるかご教授願いたいです。
できれば、他のプログラミング言語をJSに呼び出して計算とかはしたくないです。

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

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

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

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

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

guest

回答3

0

ベストアンサー

JavaScriptの数値(number)はIEEE 754 binary64(倍精度浮動小数点数)であるため、ある値までしか整数を整数として安全に計算することができません。その最大値はNumber.MAX_SAFE_INTEGERで取得でき、9007199254740991です。それ以上の整数は端数が丸め込まれて正確に計算できなくなります。11**16はこの値をこえるため、整数として正確に計算することが出来なくなります。

解決方法は二つです。

BigInt

現在提案中(stage3)であるBigIntを使えばこの制限を超えることが出来ます。最新のGoogle ChromeのデベロッパーツールのConsoleで次の計算をしてみてください。

JavaScript

111n ** 16n % 33n

ただし、BigIntは提案状態で確定した仕様ではありません。stage3まで進んでいますので、ほとんど現行の案通りに進むとは思われますが、仕様が変更される可能性は残っています。また、2019年3月15日現在、BigIntの対応状況を見ると最新のV8エンジン以外はほとんどが未実装であり、実質Google ChromeとNode.js以外には使えません。Node.jsで動作させる場合やElectronに使うとかで無ければ、使えない手段でしょう。

多倍長整数または任意精度数のライブラリ

BigIntが使えない環境であれば、Bignumber.js等のライブラリを使います。Bignumber.jsを使えば次のように書けます。

JavaScript

1BigNumber(11).pow(16).mod(33).toNumber()

こちらはブラウザの制限がありませんので、ほとんどのブラウザで使用できると思われます。

投稿2019/03/15 14:46

編集2019/03/15 14:47
raccy

総合スコア21735

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

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

onioni22

2019/03/16 00:00

一番、詳しく書かれておりわかりやすかったので、ベストアンサーにさせていただきました。 回答ありがとうございました。
guest

0

js

1(11 ** 4 % 33) ** 4 % 33

と計算してみてください。

参考: https://ja.wikipedia.org/wiki/冪剰余#途中で剰余をとる

投稿2019/03/15 14:43

mather

総合スコア6753

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

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

onioni22

2019/03/16 00:04

ちょうどRSA暗号や公開鍵、秘密鍵を勉強しているところなので、この冪剰余の考えは大変参考になります。回答ありがとうございました。
guest

0

浮動小数点の限界を超えるには任意精度整数演算を使う方法が考えられます
BigIntはChromeが率先して導入した新機能として存在します。
数値の後にnと付け加えれば実装できます。

javascript

1const bi2 = 11n**16n%33n 2console.log(bi2)

実装状況はCanIUse

しかし、今様々な環境で実装するにはbignumber.jsなどのjavascript内で完結したライブラリを導入するのがいいでしょう。

投稿2019/03/15 14:30

GunseiKPaseri

総合スコア83

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

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

onioni22

2019/03/16 00:07

一番早く回答していただきありがとうございます。最終的にはbignumber.jsを導入して解決することにしました。 回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問