rksoftware

Visual Studio とか C# とかが好きです

Power Automate で四捨五入

■ Power Automate で四捨五入

Power Automate には四捨五入を行ってくれる関数がありません。
そこで、多くの方がいろいろと頑張っているようです。軽く調べてみたら主流はどうも次のような感じみたいです。

※この記事では簡略化のため、整数に四捨五入するパターンのみを考えます。

{
    "inputs": {
        "from": [
            1.5,
            2.5
        ],
        "select": "@formatNumber(decimal(item()), 'F0')"
    }
}


■ 結果が JIS じゃない

この実行結果、JIS の四捨五入になっていません。例えば C# では次のようになります。

Console.WriteLine(Math.Round(1.5, 0));  // 2
Console.WriteLine(Math.Round(2.5, 0));  // 2

たいていの業務で四捨五入といえば、JIS の四捨五入のはずです。金額や寸法、量など。JIS の四捨五入でない業務は私は見たことがりません。

良くある呼び方

JIS の四捨五入は 銀行丸め と呼ぶ方も多いです。

■ 余談

この JIS の四捨五入、システムのバグとして報告されることが非常に多いです。
理由は、Excel がそうなっていないから。

しかし、バグとして報告されるも業務を調べたら JIS の四捨五入が正しい業務だったという確率は 100% です。覚えておくと少し不幸が避けられるかもしれません。

■ Power Automate でやってみよう

if (
  or(greater(mod(item(), 1), 0.5), equals(mod(sub(item(), mod(item(), 1)), 2), 1))
  , float(formatNumber(item(), 'F0'))
  , sub(item(), mod(item(), 1))
)
{
    "inputs": {
        "from": [
            1.5,
            2.5
        ],
        "select": "@if (\r\n  or(greater(mod(item(), 1), 0.5), equals(mod(sub(item(), mod(item(), 1)), 2), 1))\r\n  , float(formatNumber(item(), 'F0'))\r\n  , sub(item(), mod(item(), 1))\r\n)"
    }
}


それっぽい結果になりました。