何が起きていたか
身長・体重・年齢・性別から、BMI・体脂肪率・標準体重との差をまとめて出すツールで、次の3か所にずれがありました。
- BMI の区分: 身長 155.0cm・体重 96.1kg は BMI が 40 ちょうどで、「肥満(4度)」が正しい区分です。ツールは「肥満(3度)」と出していました
- 体脂肪率の区分: 150.0cm・55.8kg・28歳・男性は体脂肪率が 20.0% ちょうどで、「やや高い」が正しい区分です。ツールは「標準」と出していました
- 標準体重との差: 差がちょうど 0.05kg のとき「ほぼ標準」と出ていました(140.0cm・43.07kg。正しくは「-0.1 kg(少ない)」)
どのくらいの入力で起きていたか
下の「確かめたこと」の 2,542,074通りのうち、41,475通りでずれていました。
| 画面のどこか | 直す前 |
|---|---|
| 体脂肪率の区分 | 30,827通り |
| BMI の区分 | 5,976通り |
| 標準体重との差 | 4,672通り |
どうやって見つかったか
BMI計算 で同じ種類の不具合が見つかりました。そこで、シルギア側が、BMI から区分を決めているほかのツールを探して直しました。CODE Polyglot は、直したコードを本番に出す前と出したあとに、全通りで確かめました。
原因
BMI(体重 ÷ 身長²)も体脂肪率も、2進数の小数で計算すると、ちょうど 40・20 になるはずの値が 39.999…・19.999… になることがあります。区分は「40未満」「20未満」で決めていたので、下の区分に入りました。0.05kg の分かれ目も、2進数の小数で引き算した結果を 0.05 と比べていました。
どう直したか
BMI計算と同じく、計算を calc.js に分けました。入力の文字列を分数(BigInt)のまま扱い、区分と 0.05kg の分かれ目を、丸める前の正確な値で決めるようにしました。
確かめたこと
CODE Polyglot の検証(tools/shirugear-verify/。本番の app.js と calc.js をそのまま動かし、画面の文字を正確な分数の正解と比べる)で確かめました。
入力は次の 2,542,074通り です。
- 身長 140.0〜190.0cm × 体重 40.0〜100.0kg(0.1刻み)× 年齢 20・28・45・70 × 性別
- BMI・体脂肪率が区分の境目ちょうど、差がちょうど ±0.05kg になる体重
比べたのは、BMI と体脂肪率の数字と区分・体脂肪量・標準体重・標準体重との差です。
| 版 | 不一致 |
|---|---|
| 直す前 | 2,542,074通り中41,475通り |
修正(a764cd0ef)・本番に反映したあと(2026-10-31。本番の app.js・calc.js がコミットと同じことも確認) | 2,542,074通り中0通り |