【解決済】変数を万進法で表示させたい

chiko☆ミ
記事: 19
登録日時: 2020年11月01日(日) 08:30

【解決済】変数を万進法で表示させたい

投稿記事by chiko☆ミ » 2020年11月01日(日) 21:22

はじめまして。
最近MVの体験版を触り始めたド初心者ですが、簡単なスクリプトならなんとか理解出来ます。

大きな数字を扱うゲームを作りたいのですが、
変数に入ってる「1234567890」などを「12億3456万7890」表記に変換する方法が分かりません。
そういうゲームは少なくないのでプラグインがあるかなと思って探したのですが、見つかりませんでした。
Javascriptで変換する方法自体は見つけたのですが、
http://www.openspc2.org/reibun/javascri ... index.html
これをプラグインにする知識がなく、お願いしたいです。
それとも、もっと簡単に実現する方法がありますでしょうか。

出来れば、漢字直下の0は削除、2番目に大きい漢字未満を切り捨て、という表記にしたいです。
例)12003456789012 => 12兆34億

どうかご教授お願いします。
最後に編集したユーザー chiko☆ミ on 2020年11月09日(月) 22:57 [ 編集 3 回目 ]

jp_asty
記事: 81
登録日時: 2019年11月12日(火) 15:34

Re: 変数を万進法で表示させたい

投稿記事by jp_asty » 2020年11月03日(火) 21:26

こんばんは。

javascriptで数値はNumber型で表され、表現できる値の範囲は
-9007199254740991 から 9007199254740991 までです。

万進法にすると
-9007兆1992億5474万0991 から 9007兆1992億5474万0991 になります。

新しく追加されたBigInt型を使用するとそれよりも広い範囲(実質上限なし)を扱えますが、
仕様上の上限値は設定されておらず、ブラウザによって上限値が異なったりするようです(参考サイトより)
参考:https://qiita.com/po_tau_feu/items/225f783784f68159c37d

また、提示頂いているサイトの万進法への変換コードはNumber型で処理されているため、正しい結果が得られていません。サンプルで使用している数値は 12345678900123456789 であり、
希望する値は 1234京5678兆9001億2345万6789 ですが実際は 1234京5678兆9001億2345万8000 になってしまっています。

大きな数字を扱うゲームを作りたいのですが、

仮にその大きな数字がNumberの範囲で収まるならば素直な実装で済むと思いますが、範囲外の場合は話が複雑化すると思われます。
どれくらいの値を想定しているのでしょうか。
---------------------------------------------------------------------------------------------
プラグイン置き場 : https://github.com/ste0/RPG-Maker-MV-Plugins
chiko☆ミ
記事: 19
登録日時: 2020年11月01日(日) 08:30

Re: 変数を万進法で表示させたい

投稿記事by chiko☆ミ » 2020年11月03日(火) 23:18

こんばんは。
返信ありがとうございます。

jp_asty さんが書きました:javascriptで数値はNumber型で表され、表現できる値の範囲は
-9007199254740991 から 9007199254740991 までです。

万進法にすると
-9007兆1992億5474万0991 から 9007兆1992億5474万0991 になります。

そうなのですね…
一応、トリアコンタン様の動的文字列ピクチャ生成プラグインを使って
どの程度の数字まで表示できるのかテストはしたのですが、
その時は1e+300を超えた辺りでinfinityとなり表示出来なくなりました。
9007199254740991というのは、”厳密な計算”が出来なくなる範囲ですよね。
小さい桁を切り捨てる表示を考えてたくらいなので、ある程度の誤差は許容して
最低でも1e+68(無量大数)以上の数字は扱う想定でいました。
1e+300を超えるかどうかはバランス調整の段階まで行ってから考えようと思ってますが…

誤差を許容するなら、Numberのままで実装可能でしょうか??
jp_asty
記事: 81
登録日時: 2019年11月12日(火) 15:34

Re: 変数を万進法で表示させたい

投稿記事by jp_asty » 2020年11月04日(水) 00:13

文字列は文字コードの並びであって、数値とは異なります。
計算ができないというより表現できないというのが正しいと思います。
例えば1桁の十進法では0~9までしか表現できず10以上は表すことができないというのと同じです。
誤差というレベルではなく、そもそも桁が足らないので正しい計算ができません。

Numberで実装する場合の正の数の最大は9007199254740991で
BigIntの場合は、仕様上最大値は不定でブラウザによって異なる。クロームで試したところ2^(2^30)まで表現できた というのが上の書き込みの参考URLの結論です。

Numberの範囲を超える場合はBigIntで実装するしかないと思います。ただその場合、BigIntの仕様にありますが小数点以下は表現できなくなります。(5n /2n = 2n になる)
https://developer.mozilla.org/ja/docs/W ... cts/BigInt

・上限は不定で良い。
・小数点以下は捨てて良い。
この2つの条件がOKであるならBigIntで実装しても大丈夫そうに見えます。
---------------------------------------------------------------------------------------------
プラグイン置き場 : https://github.com/ste0/RPG-Maker-MV-Plugins
chiko☆ミ
記事: 19
登録日時: 2020年11月01日(日) 08:30

Re: 変数を万進法で表示させたい

投稿記事by chiko☆ミ » 2020年11月04日(水) 00:36

jp_asty さんが書きました:文字列は文字コードの並びであって、数値とは異なります。

いえ、ちゃんと数値として計算したものを表示しました。
クリックする度に変数に*10するボタンを作り、その変数を表示してテストプレイで連打する形でテストしました。
有効数字は16桁程度が限界ですが、大まかな計算・表現自体は308桁まで出来る様です。
https://so-zou.jp/web-app/tech/programm ... pe/number/

・上限は不定で良い。
・小数点以下は捨てて良い。
この条件2つともOKなので是非ともおねがいしたいです。m(_ _)m
jp_asty
記事: 81
登録日時: 2019年11月12日(火) 15:34

Re: 変数を万進法で表示させたい

投稿記事by jp_asty » 2020年11月04日(水) 01:14

いえ、ちゃんと数値として計算したものを表示しました。
クリックする度に変数に*10するボタンを作り、その変数を表示してテストプレイで連打する形でテストしました。
有効数字は16桁程度が限界ですが、大まかな計算・表現自体は308桁まで出来る様です。

これは Number.MAX_VALUE の値だと思います。
https://developer.mozilla.org/ja/docs/W ... /MAX_VALUE
MAX_VALUE プロパティは、およそ 1.79E+308 【訳注: E+308 は 10 の 308乗を意味します。】 または 21024 である値です。MAX_VALUE より大きい値は、"Infinity" として表されます。
---------------------------------------------------------------------------------------------
プラグイン置き場 : https://github.com/ste0/RPG-Maker-MV-Plugins
chiko☆ミ
記事: 19
登録日時: 2020年11月01日(日) 08:30

Re: 変数を万進法で表示させたい

投稿記事by chiko☆ミ » 2020年11月04日(水) 01:29

jp_asty さんが書きました:
いえ、ちゃんと数値として計算したものを表示しました。
クリックする度に変数に*10するボタンを作り、その変数を表示してテストプレイで連打する形でテストしました。
有効数字は16桁程度が限界ですが、大まかな計算・表現自体は308桁まで出来る様です。

これは Number.MAX_VALUE の値だと思います。
https://developer.mozilla.org/ja/docs/W ... /MAX_VALUE
MAX_VALUE プロパティは、およそ 1.79E+308 【訳注: E+308 は 10 の 308乗を意味します。】 または 21024 である値です。MAX_VALUE より大きい値は、"Infinity" として表されます。


??はい。なので、1.79E+308未満は表現できますよね。。?
私にはNumberでの実装で必要十分のように感じるのですが、
理解が足りないだけでBigintでないと不可能でしたらそれでお願いします。
jp_asty
記事: 81
登録日時: 2019年11月12日(火) 15:34

Re: 変数を万進法で表示させたい

投稿記事by jp_asty » 2020年11月04日(水) 01:43

説明を省略すると伝わらないようなので書きますが、
https://developer.mozilla.org/ja/docs/W ... FE_INTEGER
ここの解説欄に下記のように記述があります。

MAX_SAFE_INTEGER 定数は 9007199254740991 (9,007,199,254,740,991) である値です。その数である理由は JavaScript が IEEE 754 で指定されたとおり倍精度浮動小数点型数値を使用し安全に -(253 - 1) と 253 - 1 との間の数を表すことができるからです。

この文脈で示している安全とは、整数を正確に表現し、正しく比較する能力を指します。たとえば、 Number.MAX_SAFE_INTEGER + 1 === Number.MAX_SAFE_INTEGER + 2 は、数学的には不正確ですが true と評価されます。詳細については Number.isSafeInteger() を見てください。

このフィールドは古いブラウザーには存在しません。 Math.max(Number.MAX_SAFE_INTEGER, 2) のように存在を確認せずに使用すると、 NaN のような望ましくない結果が得られます。

MAX_SAFE_INTEGER は Number の静的なプロパティなので、自ら生成した Number オブジェクトのプロパティとしてではなく、常に Number.MAX_SAFE_INTEGER として使うようにしてください。


私がいいたいことはすべてここに書いてあり、これは仕様です。

とりあえずBigIntでの実装を検討してみようと思います。
---------------------------------------------------------------------------------------------
プラグイン置き場 : https://github.com/ste0/RPG-Maker-MV-Plugins
chiko☆ミ
記事: 19
登録日時: 2020年11月01日(日) 08:30

Re: 変数を万進法で表示させたい

投稿記事by chiko☆ミ » 2020年11月04日(水) 07:30

おはようございます。
jp_asty さんが書きました:とりあえずBigIntでの実装を検討してみようと思います。

ありがとうございます!m(_ _)m
Numberでも可能なのかと思ってしまって遠慮してましたが、
BigIntで実装できると本当に嬉しいです…!
首を長くしてお待ちしてます。

私の理解力が残念なばかりに何度も説明させてしまって大変申し訳ないです。。
今回の説明を読んでも、MAX_SAFE_INTEGER(2^53 - 1)までの範囲で正確な計算が保証されていて、
有効数字16桁でいいならMAX_VALUE(2^1024)までの範囲で表現出来る、という解釈になるのですが、
この時点で間違ってますでしょうか…?
トピックの最初で紹介させてもらった変換コードのサイトでも、MAX_SAFE_INTEGERを超えた数値で
正確ではないですが、文字列変換自体は有効数字16桁で出来ています。

有効数字16桁なら誤差±0.0000000000001%くらいなので自分的には許容できるかなと考えていたのですが
Number型のままゲームで扱うのは危険(バグる)ということですかね…?
jp_asty
記事: 81
登録日時: 2019年11月12日(火) 15:34

Re: 変数を万進法で表示させたい

投稿記事by jp_asty » 2020年11月04日(水) 20:14

こんばんは。

Numberでの実装を書いてみました。
使い方はプラグインのヘルプを御覧ください。

BigIntでの実装については検討した結果、今回は見送らせて頂きたいという結論に至りました。
この点についてお詫びさせて頂きます。
・BigIntとNumberは混合して計算できないため、利用方法が複雑になったり、利用法の説明が複雑になる。
・ある変数にはNumberが入っており、別の変数にはBigIntが入っているなど管理が複雑化する可能性がある。
・ツクールや他プラグインは基本的にNumberを使用している。
などが理由となります。

今回の説明を読んでも、MAX_SAFE_INTEGER(2^53 - 1)までの範囲で正確な計算が保証されていて、
有効数字16桁でいいならMAX_VALUE(2^1024)までの範囲で表現出来る、という解釈になるのですが、
この時点で間違ってますでしょうか…?

その認識で正しいです。問題なのは誤差を含んだ状態で値を表現できたとしても、その値を計算や比較に正しく利用できないという点です。下記サイトで詳細に説明してくれています。
https://qiita.com/uhyo/items/f9abb94bcc0374d7ed23

よろしくお願いします。

ConvertManshinho.js
(2.74 KiB) ダウンロード数: 18 回
---------------------------------------------------------------------------------------------
プラグイン置き場 : https://github.com/ste0/RPG-Maker-MV-Plugins

“MV:プラグイン素材のリクエスト” へ戻る