【问题标题】:Bankers' rounding for BigQuery银行家对 BigQuery 的四舍五入
【发布时间】:2019-10-25 12:53:00
【问题描述】:

一个简单的问题,在 BigQuery 中使用银行家四舍五入的方法是什么。

我唯一能找到的是:

这样做的方法很糟糕,但仍然有效:

CREATE TEMP FUNCTION test(num FLOAT64, decimalPlaces INT64)
RETURNS FLOAT64
LANGUAGE js AS """
    var d = decimalPlaces || 0;
    var m = Math.pow(10, d);
    var n = +(d ? num * m : num).toFixed(8); // Avoid rounding errors
    var i = Math.floor(n), f = n - i;
    var e = 1e-8; // Allow for rounding errors in f
    var r = (f > 0.5 - e && f < 0.5 + e) ?
    ((i % 2 == 0) ? i : i + 1) : Math.round(n);
    return d ? r / m : r;
""";


SELECT ROUND(1.525,2)

【问题讨论】:

标签: google-bigquery rounding


【解决方案1】:

有一种更简单的计算方法:

CREATE TEMP FUNCTION bankersRound(num FLOAT64, decimals INT64)
RETURNS FLOAT64
LANGUAGE js AS """
    var scale = Math.pow(10, decimals);
    var result =  value = (Math.round((num * scale) / 2) * 2) / scale;
    return result;
""";

【讨论】:

  • 这只会在num * scale 的形式为 E+f 时给出正确的结果,其中 E = 偶数整数和 -0.5 * 2 因素,它无法产生奇数整数(按比例放大)结果。
【解决方案2】:

方法不好,但仍然有效:

CREATE TEMP FUNCTION test(num FLOAT64, decimalPlaces INT64)
RETURNS FLOAT64
LANGUAGE js AS """
    var d = decimalPlaces || 0;
    var m = Math.pow(10, d);
    var n = +(d ? num * m : num).toFixed(8); // Avoid rounding errors
    var i = Math.floor(n), f = n - i;
    var e = 1e-8; // Allow for rounding errors in f
    var r = (f > 0.5 - e && f < 0.5 + e) ?
    ((i % 2 == 0) ? i : i + 1) : Math.round(n);
    return d ? r / m : r;
""";


SELECT ROUND(1.525,2)

【讨论】:

    猜你喜欢
    • 2023-03-22
    • 2011-03-07
    • 1970-01-01
    • 2010-09-23
    • 1970-01-01
    • 2017-12-26
    相关资源
    最近更新 更多