葉脈と潮流

純粋さを磨き、迷わない。

【Tips集】里々でも小数値の計算をしたい!

この記事は伺か・伺的 Advent Calendar 2025の3日目の記事になります。前日の記事は古閑未善さんの「作例ゴーストにいろんな機能&解説が増えたよ」でした。作例ゴーストなんて、素敵なことを。ネズの記事も紹介してもらって、ありがたいことです。

adventar.org

 

こんばんは、はじめましての人ははじめまして。新米デベロッパー(当社比)の墨鼠と申します。皆さん、小数点計算、してますか??? 日常で割り算をする瞬間、ありますよね。(ITエンジニアの小林製薬??)

ゴースト制作で手軽さを理由に人気のShioriである里々ですが、小数点を含む計算には不向きな部分があります。里々での計算は基本的に整数型で行われるので、例えば29/8などの計算をすると、計算結果としては3.625ではなく小数点以下を切り捨てた3が返ってきてしまいます。でも、里々でも小数点以下の計算をしたいこともありますよね。

今回は、里々で作成した弊ゴースト『小さなきみと歌ううた』で行ったバリバリの小数点計算を紹介しながら、里々でもいろんな小数点弄りができることを紹介していこうと思います。

 

ちなみに、最後に今回紹介するテクニックをまとめているので、お急ぎの方は最後に飛んで欲しい関数をコピペしてくださいませ。それでは、どうぞ。

 

注:タブ文字を「【タブ】」としています。replace.txtに【タブ】の変換があるかを確認してお使いください。(ポストと狛犬をもとに作っている場合は基本的に大丈夫なはずです)

 

もくじ


小数点計算をしたくない方向け

とはいえ。タイトルに反するようですが、小数点計算をしない選択だってあります。たとえば、センチメートル単位の身長をメートル単位に変換するのは、次の整数計算で可能です。

 

# 引用内は里々のソースコード

# センチメートルをメートルに変換
*整数を強引に小数に
$身長_センチ【タブ】171
$身長_メートル【タブ】(calc,(身長_センチ)/100).(calc,(身長_センチ)%100)
:(身長_センチ)cmってメートルになおすと何メートル?
:(身長_メートル)メートルですよ。

『小さなきみと歌ううた』のお二人。

 

A%Bという計算を行うとAをBで割ったときの余りが返ってきます。13÷5は2あまり3なので、「13%5」は3となるわけですね。これはまだ整数計算の範囲内です。

それを用いて、Bに10や100などの数字を入れて(A/B)と(A%B)を計算して間に小数点を入れると、Aの数字の小数点を動かしたものが得られます。今回の例では171÷100は1あまり71なので、「(calc,171/100).(calc,171%100)」はcalc内を計算して、「1.71」となります。センチメートル→メートルの変換や、パーセント→確率の変換(64%→0.64など)はこのような方法で可能です。

 

整数型でシンプルな小数点計算をする

これを応用すれば、シンプルな計算なら小数点型の計算をしなくても実現できます。

例えば、BMIの計算式は(体重[kg]/(身長[m]*身長[m]))となります。体重60kg、身長1.71mの場合は60から1.71を割ってもう一度1.71を割った20.5191…がBMIとなります。身長をcmにした場合は(10000*体重[kg]/(身長[cm]*身長[cm]))となります。

整数型で素直に計算すれば小数点以下を切り捨てた20が出てきますが、あえて10倍などにした値を計算し上記の小数点ずらし技法を使うと小数点第一位までの商が得られます。

*整数でBMI計算
$身長_センチ【タブ】171
$体重【タブ】60

#あえて10倍にしたものを計算する(計算結果:205)
BMI_10倍【タブ】(calc,(100000*(体重)/((身長_センチ)*(身長_センチ))))

#小数点をずらして第一位を取得(205→20.5)
BMI【タブ】(calc,(BMI_10倍)/10).(calc,(BMI_10倍)%10)
:ユーザさんのびーえむあい?っていくつ?
:計算によると、(BMI)みたいです。

なんで知ってるの??

基本的にはここまでの計算方法で足りるかと思います。これで足りない、ゴリゴリの小数点計算をしたい方は次の章へ行きましょう。覚悟はよろしい??

 

里々での小数点型計算の基本

まずは里々での小数点型の計算方法から。calc_float関数で計算すると、小数点以下も含めた計算をしてくれます。ただし、そのままだと返ってくる数値は整数型になってしまう(小数点以下が切り捨てられる)ので、「SAORI引数の計算」変数を無効にする必要があります。この変数はデフォルトで有効になっていますが、これが無効になっているとSAORIの動作が変わり諸々の変数操作に問題が起きる可能性があるので、小数点計算が終わったら都度戻すことをオススメします。

*小数点計算の基本
SAORI引数の計算【タブ】無効
$計算結果=(calc_float,29/8)
SAORI引数の計算【タブ】自動
29÷8はなんでしょう?
:………えっと、11?
:違います。
(計算結果)ですよ。

ドヤ顔で間違うの、いいよね………

この「SAORI引数の計算を都度戻す」が難点で、このオンオフ切り替えによって小数点計算のソースコードは煩雑になりがちです。どう煩雑になるかを、さっそく見てみましょう。

 

『小さなきみと歌ううた』の小数点計算

どういう計算をしているかは一旦置いておいて、まず小数点計算部分のソースコードを見てみましょう。

*今日の身長体重を算出
# 身長にかける倍率を乱数で取得
$身長乱数=(乱数64~1024)
SAORI引数の計算    無効
$身長係数=(calc_float,(身長乱数)*(身長乱数)/800000)
SAORI引数の計算    自動

# 身長をマイクロメートルで取得。
# その大きさに応じて単位や小数点以下の桁数を変える
$今日の身長マイクロ=(calc_float,(ユーザ身長)*10000*(身長係数))
(nop,(split,(今日の身長マイクロ),.))
$今日の身長マイクロ=(S0)
$今日の身長マイクロ=(if,(今日の身長マイクロ)>=10000,(今日の身長マイクロ)-(今日の身長マイクロ)%100,(今日の身長マイクロ)-(今日の身長マイクロ)%10)

# 体重。
SAORI引数の計算    無効
$今日の身長=(calc_float,(今日の身長マイクロ)/10000)
$今日の体重ミリグラム=(calc_float,(ユーザ体重)*(身長係数)*(身長係数)*(身長係数)*1000000)
SAORI引数の計算    自動
(nop,(split,(今日の体重ミリグラム),.))
$今日の体重ミリグラム=(S0)
$今日の体重ミリグラム=(iflist,(今日の体重ミリグラム)>=,10000000,(今日の体重ミリグラム)-(今日の体重ミリグラム)%100000,1000000,(今日の体重ミリグラム)-(今日の体重ミリグラム)%10000,10000,(今日の体重ミリグラム)-(今日の体重ミリグラム)%100,1000,(今日の体重ミリグラム)-(今日の体重ミリグラム)%10,(今日の体重ミリグラム))
$今日の体重単位=(iflist,(今日の体重ミリグラム)>=,1000000,kg,1000,g,mg)
SAORI引数の計算    無効
$今日の体重=(iflist,(今日の体重単位)==,kg,(calc_float,(今日の体重ミリグラム)/1000000),g,(calc_float,(今日の体重ミリグラム)/1000),mg,(zen2han,(今日の体重ミリグラム)))

# ユーザから見たゴーストたちの身長体重。
$相対玲奈身長=(calc_float,(玲奈身長)/(身長係数))
$相対スミレ身長=(calc_float,(スミレ身長)/(身長係数))
$相対玲奈体重=(calc_float,(玲奈体重)/((身長係数)*(身長係数)*(身長係数)))
$相対スミレ体重=(calc_float,(スミレ体重)/((身長係数)*(身長係数)*(身長係数)))
SAORI引数の計算    自動
(nop,(split,(相対玲奈身長),.))
SAORI引数の計算    無効
$相対玲奈身長=(if,(S0)>=200,(calc_float,(S0)/100)m,(S0).(at,(S1),0)cm)
SAORI引数の計算    自動
(nop,(split,(相対スミレ身長),.))
SAORI引数の計算    無効
$相対スミレ身長=(iflist,(S0)>=,200,(calc_float,(S0)/100)m,10,(S0).(at,(S1),0)cm,(S0).(substr,(S1),0,2)cm)
SAORI引数の計算    自動
(nop,(split,(相対玲奈体重),.))
$相対玲奈体重=(S0)
$相対玲奈体重単位=(iflist,(相対玲奈体重)>=,1000,t,1,kg,g)
$相対玲奈体重=(iflist,(相対玲奈体重単位)==,t,(calc,(S0)/1000).(at,(calc,(S0)%1000),0),kg,(S0).(substr,(S1),0,2),(substr,(S1),0,3))
(nop,(split,(相対スミレ体重),.))
$相対スミレ体重=(S0)
$相対スミレ体重単位=(iflist,(相対スミレ体重)>=,1000,t,1,kg,g)
$相対スミレ体重=(iflist,(相対スミレ体重単位)==,t,(calc,(S0)/1000).(at,(calc,(S0)%1000),0),kg,(S0).(substr,(S1),0,2),(substr,(S1),0,3))

わお。ゲロが出そうな煩雑さですね。自分で見ても眩暈がします。っていうか、長いって。この煩雑なコードをゼロから構築し直していきましょう。大丈夫、あなたにも書けます。

 

どういう計算をしたいか決めよう

このソースコードでは、ユーザの身長を拡大縮小したときの身長体重の算出を行っています。ユーザの身長・体重にランダムな係数をかけて拡大もしくは縮小させ、そのユーザから見たゴーストたちの身長・体重を算出しています。

ここでは、大きく分けて3つの計算を行っています。「ランダムな小数値の取得」「その小数値をユーザやゴーストの身長・体重に掛けたり割ったりする」「小数値の任意の場所での切り捨て」です。3つ目は一旦置いておいて、やりたいことをコメントで書き出してみましょう。

*身長計算テスト
# 身長にかける倍率を乱数で取得

# 身長にその倍率をかけ、その日の身長を取得

# その時の体重を取得(倍率を三回掛ける)

# ユーザから見たゴーストたちの身長体重。
# ユーザがx倍の大きさになるとき、ゴーストたちの身長は元の1/x倍になる

# ここからトーク

これらを一つ一つ肉付けしていきます。できるのか??? できらあ!!!

 

ランダムな小数の取得

さて、まずは身長に掛けるランダムな係数を取得したいです。ある時は身長が半分に、ある時は100分の1ほどまでに小さく、ある時は115%に少し大きくなったりしてほしい! 仕様的には、例えば0.01から1.15の範囲内から、ランダムに身長に掛ける係数「身長係数」を取得したいです。

しかし、里々にはランダムな小数を取得する方法がありません。その代わりに、指定した範囲の中でランダムに整数を取得する関数「乱数○〜△」があるのでそれを使います。

*小数乱数0~1
# 乱数は先に取得しておく
$ほにゃ乱数=(乱数0〜999999)

# SAORI引数の計算を無効にする
SAORI引数の計算【タブ】無効

# 小数点計算
$ほにゃ小数乱数=(calc_float,(ほにゃ乱数)/1000000)

# SAORI引数の計算を戻す
SAORI引数の計算【タブ】自動

こうすることで、0以上1未満の小数値がある程度ランダムに取得できます。(乱数○~△)の値を調節したり、整数乱数を割る値を調節することで様々な範囲の小数を取得できます。今回は0.01〜1.15までの値を分割した小数の値を取得したいので、そのように作ってみましょう。

 

*身長計算テスト
# 身長にかける倍率を乱数で取得
$身長乱数=(乱数100~11500)
SAORI引数の計算【タブ】無効
$身長係数=(calc_float,(身長乱数)/10000)
SAORI引数の計算【タブ】自動

# 身長にその倍率をかけ、その日の身長を取得

# その時の体重を取得(倍率を三回掛ける)

# ユーザから見たゴーストたちの身長体重。
# ユーザがx倍の大きさになるとき、ゴーストたちの身長は元の1/x倍になる

# ここからトーク

 

身長・体重に掛けたり割ったりする

小数の乱数が手に入ったので、これをもとに掛け算をしていきましょう。

*身長計算テスト
# 身長にかける倍率を乱数で取得
$身長乱数=(乱数100~11500)
SAORI引数の計算【タブ】無効
$身長係数=(calc_float,(身長乱数)/10000)
SAORI引数の計算【タブ】自動

# 身長にその倍率をかけ、その日の身長を取得
SAORI引数の計算【タブ】無効
$今日の身長=(calc_float,(ユーザ身長)*(身長係数))
SAORI引数の計算【タブ】自動

# その時の体重を取得(倍率を三回掛ける)
SAORI引数の計算【タブ】無効
$今日の体重=(calc_float,(ユーザ体重)*(身長係数)*(身長係数)*(身長係数))
SAORI引数の計算【タブ】自動

# ユーザから見たゴーストたちの身長体重。
# ユーザがx倍の大きさになるとき、ゴーストたちの身長は元の1/x倍になる

# ここからトーク
\cユーザの今日の身長は(今日の身長)cm、
体重は(今日の体重)kgだよ。

だいたいハーフサイズ。

ここはシンプルですね。「身長係数」が0.5のとき(身長が半分になるとき)、体重は「身長係数の3乗」倍、つまり0.125(8分の1)倍になります。こういうふうに何度も掛けたり割ったりする場合、小数点計算だと便利です。

 


また、ユーザから見たゴーストたちは逆に2倍に大きくなるので、ユーザから見たゴーストの身長体重も同様に逆数を掛けてあげます。その結果がこちらになります。

*身長計算テスト
# 身長にかける倍率を乱数で取得
$身長乱数=(乱数100~11500)
SAORI引数の計算【タブ】無効
$身長係数=(calc_float,(身長乱数)/10000)
SAORI引数の計算【タブ】自動

# 身長にその倍率をかけ、その日の身長を取得
SAORI引数の計算【タブ】無効
$今日の身長=(calc_float,(ユーザ身長)*(身長係数))
SAORI引数の計算【タブ】自動

# その時の体重を取得(倍率を三回掛ける)
SAORI引数の計算【タブ】無効
$今日の体重=(calc_float,(ユーザ体重)*(身長係数)*(身長係数)*(身長係数))
SAORI引数の計算【タブ】自動

# ユーザから見たゴーストたちの身長体重。
# ユーザがx倍の大きさになるとき、ゴーストたちの身長は元の1/x倍になる
$相対玲奈身長=(calc_float,(玲奈身長)/(身長係数))
$相対玲奈体重=(calc_float,(玲奈体重)/((身長係数)*(身長係数)*(身長係数)))
# \1側も同様の計算をするが、割愛。

# ここからトーク
\cユーザの今日の身長は(今日の身長)cm、
体重は(今日の体重)kgだよ。

ユーザから見ると玲奈は(相対玲奈身長)cm、
(相対玲奈体重)kgに見えるよ。

482cm、1293kg………!?

 

小数点の桁数を定める

とりあえず、小数の桁数が多すぎるので、丸めましょう。例えば、3.141592なんて数値は小数点以下2桁にして、3.14にするくらいが読みやすいですものね。3で割るたびに0.3333333なんて値が出てくるのもイヤですし。

ただし、里々には小数点以下の桁数を指定して切り捨てる関数はありません。そんにゃ。というわけで、上手くハックして作ってみました。

 

splitとsubstrを使う

里々にはsplitとsubstrという関数があります。簡単にいえば、splitは特定の文字で文字列を分割します。小数点で分割すると、小数点以前と小数点以降に数字を分けられます。(そのまま(split)関数を使うと分割数が表示されてしまうので、表示内容を適当な変数に代入しておきます)

$円周率=3.141592
$分割可否=(split,(円周率),.)
# 上の関数を実行した後、(S0)に小数点以前が、(S1)に小数点以下が入れられる

ちなみに。(分割可否)には分割できたときに2が、できなかったとき(整数だったとき)に1が入ります。分割できなかった時に(S1)を取り出そうとしてもうまくいかないため、splitする小数が小数点のない整数の可能性がある場合、(if,(分割可否)!=1,(処理内容))などとするとバグを回避できる、かも。

 

さらに、substr関数を使うと、小数点以下部分を好きな長さで切り捨てられます。

$円周率_小数点以下=141592
$円周率_小数点2桁【タブ】(substr,(円周率_小数点以下),0,2)
# (円周率_小数点2桁)には14が入っている

最後の「~,0,2)」部分の2を変更すると切り捨てる長さを変更できます。最後の部分を「~,0,4)」にすると小数点以下4桁に丸めて、それ以下を切り捨てることができます。

 

これらを合わせることで、強引に小数点を丸めることができます。splitしたあとの(S0)をそのまま使えば小数点以下を切り捨てた整数にもできます。

*小数点以下2桁まで丸める
$円周率=3.141592

# 小数点(ピリオド)の前後で二つに分割する(小数点以前は(S0)、小数点以降は(S1)に置かれる)
$分割可否=(split,(円周率),.)
$円周率_小数点以下2桁【タブ】(substr,(S1),0,2)
$円周率_短め=(S0).(円周率_小数点以下2桁)

\c円周率は(円周率)……
:むずかしい! およそ(S0)!!
:せめて、(円周率_短め)くらいは覚えてください……

最近はおよそ3ってあまり聞かないですねえ。

 

これを先ほどまでのソースコードに追加してみましょう。

*身長計算テスト
# 身長にかける倍率を乱数で取得
$身長乱数=(乱数100~11500)
SAORI引数の計算【タブ】無効
$身長係数=(calc_float,(身長乱数)/10000)
SAORI引数の計算【タブ】自動

# 身長にその倍率をかけ、その日の身長を取得
SAORI引数の計算【タブ】無効
$今日の身長=(calc_float,(ユーザ身長)*(身長係数))
SAORI引数の計算【タブ】自動

# 身長を小数点以下一桁まで取得
$分割可否=(split,(今日の身長),.)
$今日の身長=(if,(分割可否)!=1,(S0).(substr,(S1),0,1),(S0))

# その時の体重を取得(倍率を三回掛ける)
SAORI引数の計算【タブ】無効
$今日の体重=(calc_float,(ユーザ体重)*(身長係数)*(身長係数)*(身長係数))
SAORI引数の計算【タブ】自動

# 体重を小数点以下一桁まで取得
$分割可否=(split,(今日の体重),.)
$今日の体重=(if,(分割可否)!=1,(S0).(substr,(S1),0,1),(S0))

# ユーザから見たゴーストたちの身長体重。
# ユーザがx倍の大きさになるとき、ゴーストたちの身長は元の1/x倍になる
$相対玲奈身長=(calc_float,(玲奈身長)/(身長係数))
$相対玲奈体重=(calc_float,(玲奈体重)/((身長係数)*(身長係数)*(身長係数)))
$分割可否=(split,(相対玲奈身長),.)
$相対玲奈身長=(S0).(substr,(S1),0,1)
$分割可否=(split,(相対玲奈体重),.)
$相対玲奈体重=(S0).(substr,(S1),0,1)

# ここからトーク
\cユーザの今日の身長は(今日の身長)cm、
体重は(今日の体重)kgだよ。

ユーザから見ると玲奈は(相対玲奈身長)cm、
(相対玲奈体重)kgに見えるよ。

いいですね。あれ、0.0kg……?

 

体重の単位を変更してみる

先ほどの画像では、体重が軽すぎて0.0kgと表示されてしまいました。値が小さいときにはgやmgなどで表示したほうがよいでしょう。0.0035kgと言われてもピンと来ませんし、3.5gと書いた方が分かりやすいですものね。

条件分岐なのでifを使いますが、ここで注意点として里々の条件式は整数型の比較しかできません。(if,(ユーザ体重)<0.001,(ミリグラム変換処理))なんてことはできないわけです。

*条件式テスト_だめ
(if,0.32<1.4,TRUE,FALSE)
#なぜかわからないが、想定とは逆に「FALSE」が表示される

 

# 十分に大きな数をかけて整数化して比較すればOK
*条件式テスト_おっけー
(if,(calc_float,0.32*1000)<(calc_float,1.4*1000),TRUE,FALSE)
#「TRUE」と表示される

 

ですので、小数を比較する場合はまず整数に戻してから比較することになります。今回は、体重を最初からミリグラム単位(整数)で算出し、必要に応じて小数にしていきます。

*体重単位変換
# もともとの体重の単位は[kg]。それぞれ、22.2kg、123.4g、42mg。
$体重1=22.22222
$体重2=0.123456
$体重3=0.000042

# 体重をミリグラムに変換(一旦整数に)
# (SAORI引数の計算)を「無効」にしてないので結果は整数で出てくる
$体重1_ミリグラム=(calc_float,(体重1)*1000000)

# 体重が1000000mg(=1kg)以上のときはkgで、1000mg(=1g)以上のときはgで、それ以外ならmgで表す
$体重1_単位=(iflist,(体重1_ミリグラム)>=,1000000,kg,1000,g,mg)

# 単位がkgのときはミリグラム数から1000000で、gのときは1000で割る。
SAORI引数の計算【タブ】無効
$体重1=(iflist,(体重1_ミリグラム)>=,1000000,(calc_float,(体重1_ミリグラム)/1000000),1000,(calc_float,(体重1_ミリグラム)/1000),(体重1_ミリグラム))
SAORI引数の計算【タブ】自動

# 同様の計算を2と3でも行う
$体重2_ミリグラム=(calc_float,(体重2)*1000000)
$体重3_ミリグラム=(calc_float,(体重3)*1000000)
$体重2_単位=(iflist,(体重2_ミリグラム)>=,1000000,kg,1000,g,mg)
$体重3_単位=(iflist,(体重3_ミリグラム)>=,1000000,kg,1000,g,mg)
SAORI引数の計算【タブ】無効
$体重2=(iflist,(体重2_ミリグラム)>=,1000000,(calc_float,(体重2_ミリグラム)/1000000),1000,(calc_float,(体重2_ミリグラム)/1000),(体重2_ミリグラム))
$体重3=(iflist,(体重3_ミリグラム)>=,1000000,(calc_float,(体重3_ミリグラム)/1000000),1000,(calc_float,(体重3_ミリグラム)/1000),(体重3_ミリグラム))
SAORI引数の計算【タブ】自動

\c体重1は(体重1)(体重1_単位)、
体重2は(体重2)(体重2_単位)、
体重3は(体重3)(体重3_単位)ですよ。

かなり長くなってきましたね。うまくいっていれば、それぞれ22.2kg、123.4g、42mgと出るはずです。

ちゃんと単位と数がマッチしてますね。

単位も合わせてうまくいきました。小数点の切り捨てをしてないので体重1が横に長いですが、先ほどの小数点切り捨てを噛ませればうまくいくでしょう。そのあたりの実装は宿題にします。ウソ、割愛して記事を短くしたいだけ。

 

さて、この単位変換をソースコードに追加してみましょう。

*身長計算テスト
# 身長にかける倍率を乱数で取得
$身長乱数=(乱数100~11500)
SAORI引数の計算【タブ】無効
$身長係数=(calc_float,(身長乱数)/10000)
SAORI引数の計算【タブ】自動

# 身長にその倍率をかけ、その日の身長を取得
SAORI引数の計算【タブ】無効
$今日の身長=(calc_float,(ユーザ身長)*(身長係数))
SAORI引数の計算【タブ】自動

# 身長を小数点以下一桁まで取得
$分割可否=(split,(今日の身長),.)
$今日の身長=(if,(分割可否)!=1,(S0).(substr,(S1),0,1),(S0))

# その時の体重を取得(倍率を三回掛ける)
SAORI引数の計算【タブ】無効
$今日の体重=(calc_float,(ユーザ体重)*(身長係数)*(身長係数)*(身長係数))
SAORI引数の計算【タブ】自動

# 体重によって単位を変更
$今日の体重_ミリグラム=(calc_float,(今日の体重)*1000000)
$今日の体重_単位=(iflist,(今日の体重_ミリグラム)>=,1000000,kg,1000,g,mg)
SAORI引数の計算【タブ】無効
$今日の体重=(iflist,(今日の体重_ミリグラム)>=,1000000,(calc_float,(今日の体重_ミリグラム)/1000000),1000,(calc_float,(今日の体重_ミリグラム)/1000),(今日の体重_ミリグラム))
SAORI引数の計算【タブ】自動

# 体重を小数点以下一桁まで取得
$分割可否=(split,(今日の体重),.)
$今日の体重=(if,(分割可否)!=1,(S0).(substr,(S1),0,1),(S0))

# ユーザから見たゴーストたちの身長体重。
# ユーザがx倍の大きさになるとき、ゴーストたちの身長は元の1/x倍になる
$相対玲奈身長=(calc_float,(玲奈身長)/(身長係数))
$相対玲奈体重=(calc_float,(玲奈体重)/((身長係数)*(身長係数)*(身長係数)))
$分割可否=(split,(相対玲奈身長),.)
$相対玲奈身長=(S0).(substr,(S1),0,1)
$分割可否=(split,(相対玲奈体重),.)
# 玲奈の体重が1000kg以上のとき、単位をトンにする
$相対玲奈体重=(if,(S0)>1000,(calc,(S0)/1000).(calc,(S0)%1000),(S0).(substr,(S1),0,1))
$玲奈体重単位=(if,(S0)>1000,t,kg)

# ここからトーク
\cユーザの今日の身長は(今日の身長)cm、
体重は(今日の体重)(今日の体重_単位)だよ。

ユーザから見ると玲奈は(相対玲奈身長)cm、
(相対玲奈体重)(玲奈体重単位)に見えるよ。

ユーザも玲奈も体重の単位がちゃんと変わってる!

 

おわりに

そんなわけで、小数計算、小数点以下の任意の位置での切り捨て、小数値の整数化、小数の比較(不可能なので整数に直す)、単位の変更などを行ってみました。なお、冒頭に記載した『小さなきみと歌ううた』からの抜粋のソースコードと今回再現したソースコードは少し別物となっております。抜粋のほうを見てみると、また違う実装が見つかるかもしれません。

ちなみに、『小さなきみと歌ううた』はこちらからダウンロードできます。宣伝させて!! 猫と鼠の凸凹コンビが見たい方はぜひ。異常な小数計算も辞書に入ってるよ。

prayfortiny.net

 

とにかく、頑張れば里々でもこれくらいはできるのです。………yayaや蒼空でやれって?? 記事の存在理由を揺らがすな!!!

冗談は置いておいて。この記事がどなたかのゴースト制作に寄与できれば幸いでございます。それでは皆様、よき割り算ライフを。

 

明日4日目の記事はあーるでぃーさんの「ランダムトークを形にする」です。そちらも併せてどうぞ。

earlduant.blog.fc2.com

 

索引

最後に。今回のテクニックをまとめておきます。必要なものを適当にコピー&ペーストしてお使いくださいまし。

# センチメートルをメートルに変換
*整数を強引に小数に
$身長_センチ【タブ】171
$身長_メートル【タブ】(calc,(身長_センチ)/100).(calc,(身長_センチ)%100)
:(身長_センチ)cmってメートルになおすと何メートル?
:(身長_メートル)メートルだよ。



*整数でBMI計算
$身長_センチ【タブ】171
$体重【タブ】60

# あえて10倍にしたものを計算する(計算結果:205)
BMI_10倍【タブ】(calc,(100000*(体重)/((身長_センチ)*(身長_センチ))))

# 小数点をずらして第一位を取得(205→20.5)
BMI【タブ】(calc,(BMI_10倍)/10).(calc,(BMI_10倍)%10)
#(BMI)には「20.5」が入っている



*小数点計算の基本
# calc_floatで計算をする前に(SAORI引数の計算)を「無効」にし、計算が終わったら「自動」に戻す
SAORI引数の計算【タブ】無効
$計算結果=(calc_float,29/8)
SAORI引数の計算【タブ】自動
#(計算結果)には「3.625」が入っている



*小数乱数0~1
$ほにゃ乱数=(乱数0〜999999)
SAORI引数の計算【タブ】無効
$ほにゃ小数乱数=(calc_float,(ほにゃ乱数)/1000000)
SAORI引数の計算【タブ】自動
(ほにゃ小数乱数)



*小数点以下2桁まで丸める
$円周率=3.141592

# 小数点(ピリオド)の前後で二つに分割する(小数点以前は(S0)、小数点以降は(S1)に置かれる)
$分割可否=(split,(円周率),.)

# (分割可否)が1のときは分割できてないので例外処理をする(ここでは0を代入している)
$円周率_小数点以下2桁【タブ】(if,(分割可否)!=1,(substr,(S1),0,2),0)
$円周率_短め=(S0).(円周率_小数点以下2桁)
# (円周率_小数点以下2桁)は「14」、(円周率_短め)は「3.14」となる



# 注意! 小数の比較ができない例!!!
*小数条件式_だめ
(if,0.32<1.4,TRUE,FALSE)
#なぜかわからないが、想定とは逆に「FALSE」が表示される



# 十分に大きな数をかけて整数化して比較すればOK
*小数条件式_おっけー
(if,(calc_float,0.32*1000)<(calc_float,1.4*1000),TRUE,FALSE)
#「TRUE」と表示される