BigQuery的银行家四舍五入

问题描述 投票:1回答:2

一个简单的问题,在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)
google-bigquery rounding
2个回答
0
投票

ROUND()提供银行家取整,也称为HALF UP取整

重要的是四舍五入的精度。在您要询问的货币方面,给定货币的最小单位是多少(分,欧元,美元等的单位为0.01)。

因此,如果要舍入到[[N小数位数,请像下面这样向Round()调用提供N:

ROUND(3.1415926) = 3 //default number of fraction digits is ZERO ROUND(3.1415926, 4) = 3.1416 //9 on 5th decimal place moved 5 on 4th decimal place UP ROUND(3.1415926, 3) = 3.142 ROUND(3.1415926, 2) = 3.14

0
投票
坏方法,但仍然有效:

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)

© www.soinside.com 2019 - 2024. All rights reserved.