截断SQL Server查询中的小数位不返回精确值

时间:2018-06-27 12:36:58

标签: sql sql-server

Select round(convert(float, 7.10), 2, 1) As Amount

Result
--------
 7.09

为什么结果是7.09?

我希望结果应为7.10

3 个答案:

答案 0 :(得分:2)

尝试使用数字类型:

Select round(convert(numeric(10,2), 7.10), 2, 1) As Amount

here,您有考试!

希望获得帮助。

答案 1 :(得分:1)

您可能只想转换为小数:

Select convert(decimal(4, 1), 7.10) As Amount

十进制精确地存储一个数字-最多可保留给定的小数位数。另外,它更改结果的类型以包含此信息。 round()仅更改值,而不更改类型。

答案 2 :(得分:1)

这是更多评论,但是,它很容易传达为答案:

我认为我们真的需要更多的范围。文字值7.10将被SQL Server解释为decimal(3,2),这(本身)意味着简单的SELECT 7.10;将返回OP所遵循的值。

这表明他们实际上有一个数据类型为float的列。如果OP仅需要一条语句,那么只需将其列转换为decimal(3,2)(可能需要更大的比例即可):

CREATE TABLE #sample (floatcolumn float);
INSERT INTO #sample (floatcolumn)
VALUES (7.10),(9.767);

SELECT CONVERT(decimal(3,2),floatcolumn) AS decimalcolumn, floatcolumn
FROM #sample;

DROP TABLE #sample;

但是,这并不能从本质上解决OP在其表中的数据类型选择问题。理想情况下,他们应该先创建一个新列,然后再使用该列。也许像这样:

USE Sandbox;
GO

CREATE TABLE SampleTable (yourcolumn float);
INSERT INTO SampleTable (yourcolumn)
VALUES (7.10),(9.767);

ALTER TABLE SampleTable ADD yourcolumn2 decimal(10,3);

UPDATE SampleTable
SET yourcolumn2 = yourcolumn;

ALTER TABLE SampleTable DROP COLUMN yourcolumn;

EXEC sp_rename 'dbo.SampleTable.yourcolumn2','yourcolumn','COLUMN';

SELECT *
FROM SampleTable;

DROP TABLE SampleTable;