どの言語で起きるか
シルギアのツールは JavaScript で書かれています。この不具合が見つかったケースを、CODE Polyglot で10言語の「よくある書き方」で回した結果です(言語を返した答えごとにまとめ、赤い値は実際に返した間違った答え)。 JavaScript は 2件中2件で外れました。
| ケース | 正解 | よくある書き方の答え(10言語) |
|---|---|---|
| c0040.05 の境目・男の子 |
|
|
| c0050.05 の境目・女の子 |
|
|
何が起きていたか
父と母の身長から子どもの将来の身長の目安を出すツールで、予測身長と、その下に出す「目安(予測 ±5cm)」が食い違うことがありました。
- 父 150cm・母 145.7cm・男の子: 予測は (150 + 145.7 + 13) ÷ 2 = 154.35cm、四捨五入して 154.4cm と正しく出ていました。ところが目安は 149.3〜159.3cm と出ていました(正しくは 149.4〜159.4cm)
- 同じ両親の女の子は、予測 141.4cm に対して目安 136.3〜146.3cm(正しくは 136.4〜146.4cm)でした
どのくらいの入力で起きていたか
父 150.0〜190.0cm・母 145.0〜175.0cm(0.1cm 刻み)× 男女の 241,402通り で、正確な値と比べました。
| 食い違い | |
|---|---|
| 男の子 | 120,701通り中24,140通り |
| 女の子 | 120,701通り中24,140通り |
| 合計 | 241,402通り中48,280通り(およそ5通りに1通り) |
食い違ったのは、すべて「目安の両端がそろって 0.1cm 小さい」形でした。予測そのものは全通り正しく出ていました。
どうやって見つかったか
CODE Polyglot の17本目の仕様 子どもの将来の身長の目安 を作る前に、元のツールの式を Node で評価して、241,402通り中48,280通りで食い違うことを確かめました(2026-10-19)。
このツールは3日前(2026-10-16)に、予測身長の丸めを直したばかりでした。そのとき、目安の両端は直す対象から外れていました。
同じ日、シルギア側で「丸めを直した値と、直していない値を同じ画面に並べている」箇所を、ほかのツールにも探してもらいました。理想体重・体脂肪・BMI・お酒が抜ける時間・加湿器の畳数の5本で、画面とコピーの値の丸めを同じ値にそろえました。
原因
- 154.35 は2進数の小数では正確に表せず、154.349999… として入ります。予測は誤差を補正する丸め(
roundHalfUp)で 154.4 にしていました。目安は、丸める前の値から ±5 してtoFixed(1)で書いていました。149.349999… がそのまま丸められて 149.3 になりました(解説) - 同じ値から作る2つの表示を、別々の方法で丸めていたのが原因です
どう直したか
予測を1回だけ丸め、目安は丸めたあとの予測から ±5 するようにしました。
- var predictText = roundHalfUp(predict, 1).toFixed(1) + " cm"; - var lo = (predict - 5).toFixed(1); - var hi = (predict + 5).toFixed(1); + var p = roundHalfUp(predict, 1); + var predictText = p.toFixed(1) + " cm"; + var lo = roundHalfUp(p - 5, 1).toFixed(1); + var hi = roundHalfUp(p + 5, 1).toFixed(1);
確かめたこと
- 本番に反映する前に、修正後の
app.jsの計算部分をそのまま取り出して、正解と比べました。対象は上の241,402通りと、小数第2位までの無作為な身長50,000通り、正解表の10件です。291,412通りすべてが一致しました(2026-10-19) - 本番に反映したあと(コミット fca99c46)、本番の
app.jsがこのコミットと同じであることを確かめました。そのうえで、同じ291,412通りの一致を確認しました - 修正前の
app.jsは、同じ291,412通りのうち48,368通りで食い違いました(上の241,402通りでは48,280通り)