分享

PowerQuery中的四舍五入竟然会"出错"? 你遇到了吗

 PowerBI星球 2023-10-16 发布于河南
作者:Jacob Dong,Power Platform资深用户,微软认证Power BI 数据分析师,任职于世界500强商务卓越部门

本文介绍一个看似很简单的四舍五入问题,当我们在 Power Query 中进行保留 2 位小数的操作,可以通过界面功能实现:

如果你仔细核对结果,可能会发现一个问题。部分结果并非是我们所预期的“四舍五入”,比如3.145 被舍入成了 3.14,而非 3.15。

将该列的数值类型改变为“定点小数”的时候。也会发生同样的问题。


这是不是“Bug”呢?其实并不是。

PowerQuery中的默认舍入方法

在 Power Query 中,默认的数值舍入方法并不是“四舍五入”,而是一种被称为“Banker's rounding”(银行家舍入)的舍入方法,也被称为“四舍六入五成双”。

这种舍入方法,当遇到数值舍入位数的后一位是 5 时,它距离舍入位数两端的数值都相同,那它会被舍入到距离它最近的偶数。


为什么要用 “银行家舍入”呢?

当我们使用普通的“四舍五入”(仅考虑正数)时,所有处于“平局”(后一位是 5)的数值都被向上舍入,我们最终得到的结果将偏大。如果使用“银行家舍入”,那么数值都将被等概率进行舍入,最终得到的结果偏差将较小。

如果需要用“四舍五入”,应该怎么办?

Number.Round() 函数有 2 个参数,第一个参数是指定保留的位数,这个我们比较熟悉。默认是 0,也就是数值舍入到整数。第二个参数则是我们的舍入模式 RoundingMode.Type。当舍入位数的后一位处于“平局”时,我们指定一种舍入的模式。

  • 默认是 RoundingMode.ToEven:当处于“平局”时,舍入到最接近的偶数。

  • RoundingMode.Up:当处于“平局”时,向上舍入。

  • RoundingMode.Down:当处于“平局”时,向下舍入。

  • RoundingMode.AwayFromZero:当处于“平局”时,远离零。

  • RoundingMode.TowardZero:当处于“平局”时,靠近零。

乍看之下,RoundingMode.Up 和 RoundingMode.AwayFromZero 都可以做到对正数进行“四舍五入”,但当考虑到负数时,我们使用 RoundingMode.AwayFromZero 来满足“四舍五入”的需求

在转换数据类型为定点小数时,如果对舍入方法有要求,可以先使用 Number.Round() 函数以合适的舍入模式保留 4 位小数,然后再转换成定点小数。

数值舍入似乎是一个比较简单的话题,但实际上却一点也不。在 Power Query 中,关于数值舍入,我们还可以使用 Number.RoundUp、Number.RoundDown、Number.RoundAwayFromZero、NumberRoundTowardZero等函数,具体用法可以参考微软官方文档。

最后留 2 个小问题考考你,欢迎留言区分享你的答案~

1. DAX 中的 ROUND() 函数是什么舍入方法?为什么呢?
2. 为什么没有 RoundingMode.ToOdd?

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多