浮动数据类型的圆函数
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。
还有其他解决方案吗?请帮助..
答案 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,因为......
答案 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))