Sql server 插入2.55将得到2.549999999998
当我将2.55插入到一个带有float类型列的表中并随后检索它时,我得到了2.5499999998 以下是我使用sqlcmd所做的工作:Sql server 插入2.55将得到2.549999999998,sql-server,Sql Server,当我将2.55插入到一个带有float类型列的表中并随后检索它时,我得到了2.5499999998 以下是我使用sqlcmd所做的工作: CREATE DATABASE DB; GO USE DB; GO CREATE TABLE test (floating_col FLOAT); GO INSERT INTO test (floating_col) VALUES (2.55); GO (1 rows affected) SELECT * FROM test; GO floatin
CREATE DATABASE DB;
GO
USE DB;
GO
CREATE TABLE test (floating_col FLOAT);
GO
INSERT INTO test (floating_col) VALUES (2.55);
GO
(1 rows affected)
SELECT * FROM test;
GO
floating_col
------------------------
2.5499999999999998
(1 rows affected)
这是我正在使用的版本:
Microsoft SQL Server 2017 (RTM) - 14.0.1000.169 (X64) Aug 22 2017 17:04:49
Copyright (C) 2017 Microsoft Corporation
Developer Edition (64-bit) on Linux (Ubuntu 16.04.3 LTS)
为什么插入后不是2.55?浮点数据类型不是精确的数据类型。如果您需要精确的精度,那么您应该使用十进制或数字
您将能够使用数据类型“real”代替数据类型“float”,不会出现此类问题。使用十进制而不是float,因为浮点数据是近似值;因此,并非数据类型范围内的所有值都可以精确表示。我在Microsoft SQL Server 2014-12.0.2000.8中得到了2.55,您的SQL版本是什么?在SSMS中,我在2012年、2017年和2019年得到了2.55,@mhd.cs,但如果您使用sqlcmd,正如OP所做的,您将得到2.5499999999998。这是由于表示层解释浮点值的方式不同造成的。@Maeh,有什么原因使您在两年多的时间里没有修补SQL Server吗?您正在运行RTM版本,该版本存在已知的安全漏洞;例如,Spectre和Meldown在2018年初修复。real和float是相同的基础数据类型。real只是float24的同义词。由于OP尚未定义其浮点的精度,因此使用了默认精度值53。一个解释,张贴的代码做了什么,以及它如何解决问题,很少不能改进答案。此代码将帮助您添加任何分数,并获得与您添加的完全相同的结果。例如如果加上1.4554,则得到1.4554或121.1,则得到121.1;。如果你想加12.6689,你想得到12.6689,十进制18,2对你没有帮助。
CREATE DATABASE DB1;
GO
USE DB1;
GO
CREATE TABLE test1 (floating_col REAL);
GO
INSERT INTO test1 (floating_col) VALUES (2.55);
GO
(1 rows affected)
SELECT * FROM test1;
GO
floating_col
------------------------
2.55
(1 rows affected)
CREATE DATABASE DB1;
GO
USE DB1;
GO
CREATE TABLE test1 (floating_col REAL);
GO
INSERT INTO test1 (floating_col) VALUES (2.55);
GO
(1 rows affected)
SELECT * FROM test1;
GO
floating_col
------------------------
2.55
(1 rows affected)