【问题标题】:Avoid rounding to 0 when a result is very little当结果很小时避免四舍五入为 0
【发布时间】:2014-07-02 06:17:51
【问题描述】:

我已经搜索过这个但我没有找到任何东西,我希望这不是一个双重问题。 我正在像这样在 TSQL 中做一个公式:

@Temp = SQRT((((@Base1 - 1) * (@StDev1 * @StDev1)) 
        + ((@AvgBase - 1) * (@AvgStDev * @AvgStDev))) 
        * ((1 / @Base1) + (1 / @AvgBase)) 
        / (@Base1 + @AvgBase - 2))

但它总是返回一个 0。 @Base1@AvgBaseint,其余参数是float,但我也试过decimal(15,15)。 我还尝试使用函数POWER() 更改自乘,但我唯一无法解决的问题是这部分:(1 / @Base1) + (1 / @AvgBase),因为@Base1@AvgBase 太大了,计算结果为0 ,0001... 以及更多数字。如何强制引擎不将结果舍入为 0?谢谢

编辑:我解决了将 @AvgBase@Base1 更改为 float 类型的问题。我猜1/@param@param -> int 的结果会为您提供四舍五入的结果,当您进行投射或其他操作时,无论如何您都在处理四舍五入的结果。

【问题讨论】:

    标签: tsql floating-point decimal rounding


    【解决方案1】:

    您是否尝试过创建 @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)) AS NUMERIC(20,18)) 怎么样?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-09
    • 1970-01-01
    • 1970-01-01
    • 2018-03-16
    • 1970-01-01
    相关资源
    最近更新 更多