CODE Polyglot / 直した不具合

BMI がちょうど25のとき「ふつう」と判定し、BMI と増えた体重の表示が .x5 で下に丸まる

160.0cm・64.0kg(BMI 25 ちょうど)→「ふつう」・目安10〜13kg(正しくは「肥満(1度)」・7〜10kg)

何が起きていたか

妊娠前の身長・体重から BMI を出して体格を分け、妊娠中に増やす体重の目安と、いまどれだけ増えたかを出すツールで、次のずれがありました。

  • 区分: 身長 160.0cm・妊娠前 64.0kg は BMI が 25 ちょうどで、「肥満(1度)」・目安 7〜10kg が正しい答えです。ツールは「ふつう(普通体重)」・目安 10〜13kg と出していました
  • BMI の表示: 160.0cm・54.4kg は BMI 21.25 ちょうどで、21.3 と出るのが正しい表示です。ツールは 21.2 と出していました
  • 増えた体重の表示: 41.0kg → 46.05kg は 5.05kg 増で、「+5.1kg」が正しい表示です。ツールは「+5.0kg」と出していました

どのくらいの入力で起きていたか

下の「確かめたこと」の 717,951通りのうち、223,831通りでずれていました。

画面のどこか直す前
増えた体重194,916通り
BMI の表示41,559通り
増えた体重が目安の範囲か20,776通り
目安の範囲・補足の文466通り・301通り

増えた体重は、確かめた入力の半分ほどが「ちょうど 0.05kg の端数」になるように選んでいるので、件数が多く出ています。

どうやって見つかったか

BMI計算 で同じ種類の不具合が見つかりました。そこで、シルギア側が、BMI から区分を決めているほかのツールを探して直しました。CODE Polyglot は、直したコードを本番に出す前と出したあとに、全通りで確かめました。

原因

  • 64 ÷ 1.6² を2進数の小数で計算すると 24.999… になり、bmi < 25 で「ふつう」に入りました
  • 46.05 − 41.0 を2進数の小数で計算すると 5.049999… になり、小数第1位に四捨五入すると 5.0 になりました。BMI の表示も同じ理由で、ちょうど .x5 のときに下に丸まっていました

どう直したか

BMI計算と同じく、計算を calc.js に分けました。入力の文字列を分数(BigInt)のまま扱い、区分を丸める前の正確な値で決め、BMI と増えた体重を正確な値から1回だけ四捨五入するようにしました。

増えた体重が目安の範囲に入っているかは、画面に出した(丸めたあとの)値で判定します。「+13.0kg」と出ているのに「上限を超えています」と出ると食い違って見えるためです(シルギアの決まり)。

確かめたこと

CODE Polyglot の検証(tools/shirugear-verify/。本番の app.js と calc.js をそのまま動かし、画面の文字を正確な分数の正解と比べる)で確かめました。

入力は次の 717,951通り です。

  • 身長 140.0〜190.0cm × 妊娠前の体重 40.0〜100.0kg(0.1刻み)。現在の体重は、妊娠前の体重に 0.05kg ちょうど・マイナスを含む24通りの増加量を足したものか、空
  • 身長 158.0cm × 体重 0.1刻み × 増加量 −2.00〜+20.00kg(0.05刻み)の全部
  • BMI が区分の境目ちょうど、表示の四捨五入の境目ちょうどになる体重
  • エラーになる入力

比べたのは、BMI と区分・目安の範囲・補足の文・増えた体重と、それが目安の範囲か・表示の出し分けです。

版不一致
直す前717,951通り中223,831通り
修正(0994adb8e)・本番に反映したあと(2026-10-31。本番の app.js・calc.js がコミットと同じことも確認)717,951通り中0通り

← 直した不具合の一覧へ