Банковские округления для BigQuery - PullRequest
1 голос
/ 25 октября 2019

Простой вопрос, как использовать банковское округление в BigQuery.

Единственное, что я могу найти, это: enter image description here

ПЛОХОЙ ПУТЬ всделать это, но все еще работает:

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)

Ответы [ 2 ]

1 голос
/ 25 октября 2019

Существует более простой способ его вычисления:

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;
""";
0 голосов
/ 25 октября 2019

Плохой путь, но все еще работает:

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)
...