sql舍入并不总是四舍五入

时间:2012-02-13 18:54:14

标签: sql sql-server rounding currency

我正在尝试在sql中进行一轮但是结果非常奇怪;这是我做的:

我正在使用Mssql

我有一个选择:

Select num1, num2, num1 * num2, round(num1 * num2, 2)
from myTable

数据类型:

  

num1是一个浮动

     

num2是钱

如果num1的值是15 而num2的值是0.033 这是我的结果集:

  

15,0.033,0.495,0.5

问题在于我有这些值:

如果num1的值是5 而num2的值是0.045 这是我的结果集:

  

5,0.045,0.225,0.22

有人有想法吗?

4 个答案:

答案 0 :(得分:5)

如果您在网格视图模式下查看this runnable example(请注意文本模式不同),您应该会看到问题:

DECLARE @tbl AS TABLE (num1 float, num2 money);
INSERT INTO @tbl VALUES (15, 0.033), (5, 0.045);

Select num1, num2, num1 * num2, round(num1 * num2, 2)
from @tbl;

请注意,该数字实际上是.224999999,它向下舍入到.22 - 在查看SQL Server的非二进制输出时需要小心 - 它有时会以您不期望的方式将数字转换为文本。 / p>

这来自浮动*货币操作,导致浮动,受二元表示问题的影响。

您应该考虑它对您的浮点值意味着什么,并考虑使用小数而不是look at the rules for scale and precision for decimal operations。请注意,钱只有一些类似于十进制(19,4)

答案 1 :(得分:1)

您可以尝试使用long类型而不是float类型。我认为这是浮动的准确性问题。

答案 2 :(得分:0)

您使用的是哪个版本的SQL?

在查询分析器中试用此代码


DECLARE @num1 float
DECLARE @num2 money

SET @num1 = 15
SET @num2 = 0.033

SELECT
@Num1,
@Num2,
@Num1 * @Num2,
ROUND(@Num1 * @Num2,0),
ROUND(@Num1 * @Num2,1),
ROUND(@Num1 * @Num2,2),
ROUND(@Num1 * @Num2,3)

浮点数是近似值而不是实数。改为使用十进制。


DECLARE @num1 decimal
DECLARE @num2 money

SET @num1 = 5
SET @num2 = 0.045

SELECT
@Num1,
@Num2,
@Num1 * @Num2,
ROUND(@Num1 * @Num2,2),
ROUND(CAST(@Num1 as money) * @Num2,2)

答案 3 :(得分:0)

我已将我的浮动列转换为金钱,它现在似乎正在运作。

谢谢大家!