何が起きていたか
妊娠前の身長・体重から 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通り |