Tsql 当结果非常小时,避免四舍五入到0
我已经搜索过了,但是没有找到任何东西,我希望这不是一个双重问题。 我在TSQL中做一个公式,如下所示:Tsql 当结果非常小时,避免四舍五入到0,tsql,floating-point,decimal,rounding,Tsql,Floating Point,Decimal,Rounding,我已经搜索过了,但是没有找到任何东西,我希望这不是一个双重问题。 我在TSQL中做一个公式,如下所示: @Temp = SQRT((((@Base1 - 1) * (@StDev1 * @StDev1)) + ((@AvgBase - 1) * (@AvgStDev * @AvgStDev))) * ((1 / @Base1) + (1 / @AvgBase)) / (@Base1 + @AvgBase - 2)) 但它总是给我一个0。 @
@Temp = SQRT((((@Base1 - 1) * (@StDev1 * @StDev1))
+ ((@AvgBase - 1) * (@AvgStDev * @AvgStDev)))
* ((1 / @Base1) + (1 / @AvgBase))
/ (@Base1 + @AvgBase - 2))
但它总是给我一个0。
@Base1
和@AvgBase
是int
,其余参数是float
,但我也尝试了十进制(15,15)
。
我还尝试用函数POWER()
更改自乘法,但唯一无法解决的问题是这一部分:(1/@Base1)+(1/@AvgBase)
,因为@Base1
和@AvgBase
太大了,计算结果是00001。。。还有更多的数字。如何强制引擎不将结果四舍五入为0?谢谢
编辑:我将
@AvgBase
和@Base1
更改为float
类型,解决了这个问题。我猜结果1/@param
,带有@param
->int
会给你一个四舍五入的结果,当你去铸造它或其他什么的时候,你无论如何都在处理一个四舍五入的结果。你试过创建一个@INVBase1=(1/@Base1)
?这是否也将四舍五入为0?使用这个新变量的数据格式时会发生什么
你试过了吗
/ ((@Base1) + (@AvgBase))
而不是
* ((1 / @Base1) + (1 / @AvgBase))
我尝试了支持参数(实际上我正在处理这些参数,但为了解释问题,我不得不分享整个公式),结果是一样的。第二个选项是不正确的,因为a/(b+c)与a*((1/b)+(1/c))不同。那么你需要试试a/b+a/c。我认为问题在于base1和avg base是整数。1也将被铸造为int。因此,您将有一个返回整数的整数计算。但是您需要一个数值。那么*CAST((1/@Base1)+(1/@AvgBase))作为数字(20,18))呢?