【解決済み】ステート有効度(又は属性)の値について

返信する
天音 衣月
記事: 10
登録日時: 2022年8月24日(水) 22:05

【解決済み】ステート有効度(又は属性)の値について

投稿記事 by 天音 衣月 »

こんにちは。
「ステート有効度」や「属性有効度」を「耐性」と表示する為に、
「(1-a.stateRate(4))*100」という計算式で考えていたのですが、
何故か特定の数値のみ小数点の値で取得されてしまいます。

※画像は一例。左上から下に「毒、暗闇、沈黙」右上から下に「激昂、混乱、魅了」
計算結果.png
計算結果.png (45.15 KiB) 閲覧された回数 1067 回
防具パラメータ.png
防具パラメータ.png (28.26 KiB) 閲覧された回数 1067 回
これは「変数の操作」で「(1-$gameActors.actor(1).stateRate(4))*100」と入れて、
「文章の表示」で代入した変数を呼び出した結果が
「切り捨ての数値(毒の値で言うなら19)」になっていた事から、
表示に利用しているプラグインが要因ではないと考えています。
小数点が表示される数値とされない数値があるのもよく分かりません。
現状対策としては「Math.floor()」等を利用して表示させる予定ですが、
理由が分からないままなのも腑に落ちないので、質問させて頂いた次第です。
宜しくお願い致します。
最後に編集したユーザー 天音 衣月 [ 2022年8月26日(金) 19:07 ], 累計 1 回
名無し蛙
記事: 352
登録日時: 2015年11月23日(月) 02:46

Re: ステート有効度(又は属性)の値について

投稿記事 by 名無し蛙 »

ステート有効度とかは全く関係無くJavaScriptの小数の演算における仕様です。
例えば自然数の13というデータを表現する場合は8が1つ、4が1つ、1が1つで
二進数で表すと1101になる、というのは直感的に理解出来ると思います。

では小数(Javascript で基本採用されているIEEE 754 倍精度浮動小数点数)はどのように表現するかというと
1/2が1つ、1/4が1つ、1/8が1つ…と1/2^nの数値を組み合わせて目的の小数に近付けています。
表示する時に(数値).toString(2)と書く事で二進数での表現を確認出来ます。
0.5、0.875等は単純ですけど0.2、0.3等は不規則な0と1が並んでる事が見て取れると思います。
実際は符号部と指数部というものもあり、更に複雑な管理をしているのですが
簡単な小数一つに64bitのデータ領域をフル活用している事が分かると思います。

その為、小数の演算(特に加減算)をする度にデータロス(誤差)が発生するのは必然で
その仕様を踏まえた上で取り扱う必要が有ります。
つまりJavaScriptでは基本的に小数が絡んだ計算は高速と引き換えに正確な答えを求める事は捨てていて
近似値を求めているだけ、と言っても差し支えないと思います。
この辺は詳しい事を知りたければ浮動小数点数で調べてください。
まとめるとコンピュータにとってキリが良い計算とキリが悪い計算があり、
(1-0.65)と(1-0.35)はたまたまキリが良くロスが発生しなかった、とそれだけの話ですね。
あと.floor(切り捨て)よりも.round(四捨五入)の方が良いと思います。
天音 衣月
記事: 10
登録日時: 2022年8月24日(水) 22:05

Re: ステート有効度(又は属性)の値について

投稿記事 by 天音 衣月 »

>名無し蛙 様
なるほど。java script側の仕様だったのですね。
「浮動小数点数」 は難しかったですが、2進数の表現は知っていたので、
1/2、1/4の説明で、正確な数値を取るのは難しいという事は何となく分かりました。
(tostringでの数値の変化も確認しました)
小数点を扱う際には注意しようと思います。
また、おススメの通りroundの方で対応しようと思います。
丁寧な解説ありがとうございました。
返信する

“MV:質問”に戻る