当前位置: 首页 > 面试题库 >

SQL Server四舍五入问题,其中有5

邵阳
2023-03-14
问题内容

据我所知,当四舍五入为5时,四舍五入应按以下方式进行。

2.435 => 2.44 (Round Up, if rounding to digit(3) is odd number)
2.445 => 2.44 (Round Down, if rounding to digit(4) is even number)

如果我们做所有的总结,

2.435 + 2.445 =  4.88
2.44 + 2.44 = 4.88

我很确定在.Net中也可以进行这种四舍五入。

但是在SQL Server中,总会四舍五入,这在数学上是不正确的。

SELECT round(2.345, 2)  = 2.35
SELECT round(2.335, 2) => 2.34

这导致四舍五入后的总值相差1美分。

2.345 + 2.335 = 4.68
2.35 + 2.34 = 4.69 => which is not correct

我已经尝试过使用十进制和货币数据类型。

难道我做错了什么?有没有解决的办法?


问题答案:

如果您确实想在SQL Server中使用银行取整…

CREATE FUNCTION BankersRounding(@value decimal(36,11), @significantDigits INT)        
RETURNS MONEY        
AS        
BEGIN        
    -- if value = 12.345 and signficantDigits = 2...

    -- base = 1000        
    declare @base int = power(10, @significantDigits + 1)


    -- roundingValue = 12345        
    declare @roundingValue decimal(36,11) = floor(abs(@value) * @base)        
    -- roundingDigit = 5        
    declare @roundingDigit int = @roundingValue % 10

    -- significantValue = 1234        
    declare @significantValue decimal(36,11) = floor(@roundingValue / 10)        
    -- lastSignificantDigit = 4        
    declare @lastSignificantDigit int = @significantValue % 10


    -- awayFromZero = 12.35        
    declare @awayFromZero money = (@significantValue + 1) / (@base / 10)        
    -- towardsZero = 12.34        
    declare @towardsZero money = @significantValue / (@base / 10)

    -- negative values handled slightly different        
    if @value < 0        
    begin        
        -- awayFromZero = -12.35        
        set @awayFromZero = ((-1 * @significantValue) - 1) / (@base / 10)        
        -- towardsZero = -12.34        
        set @towardsZero = (-1 * @significantValue) / (@base / 10)        
    end

    -- default to towards zero (i.e. assume thousandths digit is 0-4)        
    declare @rv money = @towardsZero        
    if @roundingDigit > 5        
        set @rv = @awayFromZero  -- 5-9 goes away from 0        
    else if @roundingDigit = 5         
    begin        
        -- 5 goes to nearest even number (towards zero if even, away from zero if odd)        
        set @rv = case when @lastSignificantDigit % 2 = 0 then @towardsZero else @awayFromZero end        
    end

    return @rv

end


 类似资料:
  • 有人能向我解释为什么以下代码: 给出以下输出? 以防您没有看到:“6.2089”四舍五入为3位给出输出“6.208”,而“6.2088”给出“6.209”作为输出。少即是多? 当使用Java 5、6或7时,结果很好,但这个Java 8给了我这个奇怪的输出。Java版本: 编辑:这是Java7的输出: Java7版本:

  • 本节讨论了精度数学的四舍五入特性,ROUND()函数,以及插入DECIMAL列时的四舍五入特性。 ROUND()函数的行为取决于其参量是准确的还是近似的: ·对于准确值数值,ROUND()采用“半值向上舍入”规则:如果小数部分的值为.5或更大,如果是正数,向上取下一个整数,如果是负数,向下取下一个整数(换句话讲,以0为界限执行舍入)。如果小数部分的值小于.5,如果是正数,向下取下一个整数,如果是负

  • 问题内容: 我怎么总是将a舍入为一个,而不舍入它。我知道,但是我希望它总是四舍五入。因此,如果为,则四舍五入为4。 问题答案: 您可以使用方法。 请参阅JavaDoc链接:https ://docs.oracle.com/javase/10/docs/api/java/lang/Math.html#ceil(double ) 从文档: 细胞 返回大于或等于自变量且等于数学整数的最小(最接近负无穷大

  • 有人能告诉我怎么打双人球吗 e、 g.从双倍值55.6666666666667开始-四舍五入到双倍值56.0000000000- 或者从55.333333333333开始-四舍五入到55.0000000000的两倍- 谢谢。

  • 问题内容: 现在我正在尝试: 在哪里,但它不起作用。我究竟做错了什么? 问题答案: 代码段中方法的返回类型是什么? 如果是这种方法,则当输入参数为Double时将返回Long。 因此,您将必须强制转换返回值:

  • 问题 你想对浮点数执行指定精度的舍入运算。 解决方案 对于简单的舍入运算,使用内置的 round(value, ndigits) 函数即可。比如: >>> round(1.23, 1) 1.2 >>> round(1.27, 1) 1.3 >>> round(-1.27, 1) -1.3 >>> round(1.25361,3) 1.254 >>> 当一个值刚好在两个边界的中间的时候, round