本文介绍一个看似很简单的四舍五入问题,当我们在 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.Up 和 RoundingMode.AwayFromZero 都可以做到对正数进行“四舍五入”,但当考虑到负数时,我们使用 RoundingMode.AwayFromZero 来满足“四舍五入”的需求。 在转换数据类型为定点小数时,如果对舍入方法有要求,可以先使用 Number.Round() 函数以合适的舍入模式保留 4 位小数,然后再转换成定点小数。 数值舍入似乎是一个比较简单的话题,但实际上却一点也不。在 Power Query 中,关于数值舍入,我们还可以使用 Number.RoundUp、Number.RoundDown、Number.RoundAwayFromZero、NumberRoundTowardZero等函数,具体用法可以参考微软官方文档。 最后留 2 个小问题考考你,欢迎留言区分享你的答案~ |
|