sql舍入并不总是四舍五入

Gre*_*egM 4 sql sql-server currency rounding

我想在sql中做一个回合,但结果很奇怪; 这是我做的:

我正在使用Mssql

我有一个选择:

Select num1, num2, num1 * num2, round(num1 * num2, 2)
from myTable
Run Code Online (Sandbox Code Playgroud)

数据类型 :

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

有人有想法吗?

Cad*_*oux 5

如果您在网格视图模式下查看此可运行示例(请注意文本模式不同),您应该看到问题:

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;
Run Code Online (Sandbox Code Playgroud)

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

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

您应该考虑它对您的浮点值意味着什么,并考虑使用十进制代替,并查看小数运算的比例和精度规则.请注意,钱只与十进制有些相似(19,4)