sql 小数精度问题

本文探讨了在SQL中处理浮点数运算精度问题的方法,通过对比不同数据类型和精度设置,展示了如何确保复杂计算的准确性,避免因默认精度限制导致的结果误差。


    DECLARE @net_qty DECIMAL(18,10)
    DECLARE @rate DECIMAL(18,10)
    SET @net_qty=3
    SET @rate=95
    SELECT  CAST( @net_qty/(1-@rate*0.001) AS DECIMAL(18,10))

    SELECT 3/(1-95*0.001) 

修改后sql 


    DECLARE @net_qty FLOAT(38)
    DECLARE @rate FLOAT(38)
    SET @net_qty=3
    SET @rate=95
    SELECT  CAST( @net_qty/(1-@rate*0.001) AS FLOAT(38))

    SELECT CAST( 3/(CAST(1 AS FLOAT(38))-95*0.001) AS FLOAT(38))

总结:

以上两个例子说明, 3/(1-95*0.001)  这个计算后由于精度不确定sql默认保留8位小数。再加上cast(1 as float(38))后, 精度识别位38位。算出来就和上面一个计算结果相同了。

### 关于 MS SQL 中用于控制小数精度的函数 #### ROUND 函数 `ROUND()` 是一种数值函数,能够接收三个参数来精确控制数字的舍入方式。第一个参数是要处理的数值;第二个参数指定了要保留的小数位数;第三个参数则是可选项,决定了当其值不是 0 时是否应该截断而不是四舍五入[^2]。 例如: ```sql -- 对 10.45 进行不同的舍入操作 SELECT ROUND(10.45, 0) AS RoundToZeroDecimal; -- 结果为 10.00 SELECT ROUND(10.45, 1) AS RoundToOneDecimal; -- 结果为 10.50 SELECT ROUND(10.45, 2) AS RoundToTwoDecimals; -- 结果为 10.45 SELECT ROUND(10.45, 1, 1) AS TruncateToOneDigit; -- 结果为 10.40 ``` #### FLOOR 函数 `FLOOR()` 向下取整到最接近给定表达式的最小整数或指定位置之前的零。这意味着无论后面的数字是多少,都将被丢弃并返回较小的那个整数值[^3]。 实例展示如下: ```sql -- 使用 floor() 下探至最近的较低整数 SELECT FLOOR(1.99) AS FloorExampleOne; SELECT FLOOR(-1.99) AS FloorExampleNegative; ``` 对于带有正负号的情况,`FLOOR()` 总是会向更远离零的方向移动直到遇到下一个完整的单位。 #### CEILING 函数 相反地,`CEILING()` 返回大于等于输入值得最小整数。换句话说,它总是向上调整到更高的整数级别[^4]。 这里有一些例子说明如何应用 `CEILING()`: ```sql -- 应用 ceiling() 上升到较高的整数水平 SELECT CEILING(1.01) AS CeilingExamplePositive; SELECT CEILING(-1.01) AS CeilingExampleNegative; ``` 这些函数提供了灵活的方式来管理和调整数据中小数部分的表现形式,适用于各种场景下的需求分析与报告生成工作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值