なんちゃって四捨五入(PLC編)
新人プログラマ応援 - みんなで新人を育てよう!
~条件分岐なしで丸める最小ラダー~
条件分岐なしで丸める最小ラダー
PLC で四捨五入を作るとき、
新人さんはよく 「0.5 以上なら +1」 みたいな
条件分岐ラダーを書きがちです。
でも実は、
四捨五入は “余り×2 ÷ 除数” を商に足すだけ で作れます。
つまり、
- IF文いらん
- 比較命令いらん
- ラダーが一瞬で終わる
なんちゃって四捨五入は桁操作不要
教科書的な四捨五入というと、
小数第1位を丸めたいなら
被除数を×10 して
演算して
+5 して
÷10 する
という 桁操作の手順 が必ず必要になります。
しかし、なんちゃって四捨五入では
丸めたい桁を一切いじらずに四捨五入できます。
これが “なんちゃって” の名前の由来であり、
新人さんにまず伝えたい 最小の丸め方法 です。
最小構成(考え方)
商 = 被除数 ÷ 除数
余り = 被除数 % 除数
(余り × 2) ÷ 除数 → 0 or 1
これを商に足すだけで四捨五入が完成。
ラダー(コピペで動く最小版 キーエンス)
・ DM0:被除数(割られる側)
・ DM2:除数(割る側)
・DM10:商(何を隠そう。答え)
・ TM1:あまり(K社の仕様 1word時)
下記コードを
変種(E) > リスト編集(L) で貼り付け
最下段 [挿入(I)] ボタンでラダー完成!
1行で完結。
LD CR2002
LDA.S DM0
CON
EXT.S
CON
DIV.S DM2
CON
STA.S DM10
CON
LDA.S TM1
CON
MUL.S +2
CON
DIV.S DM2
CON
ADD.S DM10
CON
STA.S DM10
これで 四捨五入 完成。
条件分岐ゼロ。
例題
商 = 13567 ÷ 100 = 135
余り = 67
余り×2 = 134
134 ÷ 100 = 1
→ 商 + 1 = 136
商 = 987 ÷ 25 = 39
余り = 987 - (25×39) = 987 - 975 = 12
余り×2 = 24
24 ÷ 25 = 0
→ 商 + 0 = 39
普通の四捨五入と同じ結果。
あるある失敗例(YouTubeのPLC講座でもよく見るやつ)
四捨五入の説明で、
「余り ≥ (除数 / 2) なら +1」
というロジックを紹介している動画をよく見かけます。
一見正しそうですが、
除数が奇数のときに壊れます。
理由は、PLC の整数割り算が 小数を切り捨てる からです。
除数本来の境界は:
7 / 2 = 3.5
でも PLC の整数演算では:
7 / 2 = 3 ← 小数切り捨て
境界が 3 にズレる ため、こうなります。
52 / 7
商 = 7
余り = 3
余り[3] ≥ (除数/2 [3]) → 3 ≥ 3 → 成立
→ 商[7]+1 = 8(誤り)
正しい方法(この記事の本題)
(余り × 2) ÷ 除数
これなら 奇数でも偶数でも必ず 0 か 1 が返るので、
境界ズレが起きません。
まとめ
- 四捨五入は 余り×2 ÷ 除数 で作れる
- 条件分岐なし
- ラダー最小
- 新人でも 5 分で理解できる
“なんちゃってシリーズ”としては
最小で最速の丸め処理。
この記事の内容をそのまま試せる
KV-STUDIO ファイル を用意しました。
👉 サンプルZIPはこちら
https://yenqoo.com/qiita/5Rounding4.ZIP
▼ 参考:より詳しい丸めの考え方(Spices)
https://yenqoo.com/spices/basic/rounding/rounding.html
この記事が、必要な人へ。
困っている人に、届きますように。
▼ 関連記事(なんちゃってシリーズ)
• なんちゃってタブスイッチ(VT編)
https://qiita.com/yenqoo/items/74c89bbe955e36e5d22a
▼ 人気記事
• キーエンスPLCで信号灯を“グラデーション点滅”させる方法
https://qiita.com/yenqoo/items/9a2509b26e415a87a39c
作者
圓空(えんくう)
https://yenqoo.com/spices/
https://yenqoo.com/monologue/
キーエンスPLCを中心に、
“技術 × 美学 × 遊び心” をテーマにした技術文化を発信しています。

