tsql中的round函数

时间:2016-10-26 10:38:02

标签: sql sql-server

浮动数据类型的圆函数

SELECT ROUND((CONVERT(DECIMAL(10,2),@Amt)-CONVERT(DECIMAL(10,2),@Tax))/@Qty, 2,1)

它给出的输出为65.69 但我想要65.70

不知道为什么它不适用于float数据类型。如果我的数据类型是十进制,那么它可以工作,但在我的数据库中它的浮点数,我不想舍入。

如果我使用转换为十进制,则可以使用

"
Caused by: java.lang.RuntimeException: Failed to load native library
at com.microsoft.office.sfb.appsdk.Application.LoadNativeLibrary(Application.java:98)
at com.microsoft.office.sfb.appsdk.Application.initialize(Application.java:63)
at com.microsoft.office.sfb.appsdk.Application.getInstance(Application.java:112)
at kz.altyn.portalmobile.skype.SkypeCall.onCreate(SkypeCall.java:68)
"

它给我输出为65.700000。

还有其他解决方案吗?请帮助..

4 个答案:

答案 0 :(得分:3)

答案是不要使用FLOAT,如果可以避免,尤其是(!)的货币金额。

70.96 - 5.26 = 65.7对我们来说很精确,但它不能精确地存储在FLOAT中,因为70/100没有精确的二进制表示,并且您将始终获得舍入工件。

解决方案:改为使用DECIMAL

这样:

DECLARE @Amt DECIMAL(10,2)
DECLARE @Tax DECIMAL(10,2)
DECLARE @Qty TINYINT
SET @Amt=70.96
SET @Tax=5.26
SET @Qty=1
SELECT (@Amt-@Tax)/@Qty

是的,我确实忽略了ROUND-call,因为......

  • 这不会改变结果;
  • 如果目的是获得具有一定量小数的输出,那么不应该在SQL后端但在App / Web前端中进行,因为它是一个表示问题,这通常意味着采用区域设置/区域/用户 - 考虑到这一点。

答案 1 :(得分:2)

ROUND函数的第三个参数指定值是舍入还是截断。

因此,您可以使用以下语句来获得预期结果:

DECLARE @Amt Float
DECLARE @Tax Float
DECLARE @Qty TINYINT
SET @Amt=70.96
SET @Tax=5.26
SET @Qty=1
SELECT ROUND((@Amt-@Tax)/@Qty, 2,0)

有关详细信息,请参阅MSDN

答案 2 :(得分:2)

语法: - ROUND ( numeric_expression , length [ ,function ] )

Thaird参数是round中的“函数”: - 因此,如果指定了0以外的值(在第三个参数中),则会截断numeric_expression。请参阅下文了解更多信息。

来自MSDN

  

功能是要执行的操作类型。功能必须是tinyint,   smallint或int。省略功能或值为0时   (默认值),numeric_expression是四舍五入的。当0以外的值是   指定的,numeric_expression被截断。

DECLARE @Amt Float
    DECLARE @Tax Float
    DECLARE @Qty TINYINT
    SET @Amt=70.96
    SET @Tax=5.26
    SET @Qty=1

    SELECT ROUND((@Amt-@Tax)/@Qty, 2,0)

对于您使用的第二个查询,我在下面做了一些更改。

SELECT ROUND(CONVERT(DECIMAL(10,2),CONVERT(DECIMAL(10,2),@AMT)- 
CONVERT(DECIMAL(10,2),@TAX)/@QTY),2)

我再次使用convert的原因是,您的表达式已隐式转换为十进制(15,6)数据类型。 有关以下查询的更多信息,请

SELECT Sql_variant_property(CONVERT(DECIMAL(10, 2), @AMT) - CONVERT(DECIMAL(10, 2), @TAX) / @QTY, 'BASETYPE'),
       Sql_variant_property(CONVERT(DECIMAL(10, 2), @AMT) - CONVERT(DECIMAL(10, 2), @TAX) / @QTY, 'SCALE'),
       Sql_variant_property(CONVERT(DECIMAL(10, 2), @AMT) - CONVERT(DECIMAL(10, 2), @TAX) / @QTY, 'PRECISION') 

答案 3 :(得分:1)

使用CAST

DECLARE @Amt Float
DECLARE @Tax Float
DECLARE @Qty TINYINT
SET @Amt=70.96
SET @Tax=5.26
SET @Qty=1


SELECT CAST((ROUND((@Amt-@Tax)/@Qty, 2,0)) as DECIMAL(10,2))