我正在尝试在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
有人有想法吗?
答案 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)
我已将我的浮动列转换为金钱,它现在似乎正在运作。
谢谢大家!