Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 插入2.55将得到2.549999999998_Sql Server - Fatal编程技术网

Sql server 插入2.55将得到2.549999999998

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

当我将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

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)