我正在使用Node.js的Loopback框架开发的应用程序。我需要从csv中读取数据并将其保存在我的SQL Server数据库中(我使用的是SQL Server 2014实例)。 csv文件的一列包含16位十进制数字。我从csv文件中读取它们没有问题,但是当我将它们保存在DB上时,它会更改最后的十进制数字。例如,csv的第一行的值为" 0.0059888523696288"但在数据库中我发现" 0.0059888525865972"。
我在我的javascript代码中执行了一个console.log来检查数字并且它们已正确打印,所以我猜测数据被DB读取时会出现问题。
这是我的javascript模型中映射的属性的定义:
"forecast": {
"type": "Number",
"required": true,
"length": null,
"precision": 53,
"scale": null,
"mssql": {
"columnName": "forecast",
"dataType": "float",
"dataLength": null,
"dataPrecision": 53,
"dataScale": null,
"nullable": "NO"
}
}
我尝试将DB表中列的定义更改为十进制(18,16)和模型中的一个,我再次执行了插入,但得到了相同的结果。
有关此行为的任何解释以及如何在数据库上获取正确的数字?
编辑:
我按照评论中的建议做了一些日志记录,这里有一个输出示例:
从csv读取的值:0.0045747027551005
存储在另一个js变量中的值:0.0045747027551005
连接器输出:
loopback:connector:mssql SQL:
DECLARE @insertedIds TABLE (id INT)
INSERT INTO [dbo].[PLAN]([plan],[period],[forecast]) OUTPUT INSERTED.[id] into @insertedIds VALUES(@param1,@param2,@param3)
SELECT id AS insertId from @insertedIds
Parameters: [137,17,0.0045747027551005] +3ms
存储在db:0.0045747025869787
上的值即使将列更改为十进制(28,16),我也得到了相同的输出。这很奇怪。
答案 0 :(得分:0)
您正在SQL服务器中使用Float数据类型,这是一个从-1.79E + 308到1.79E + 308的浮动精度数字数据。所以这不完全正确。
你应该使用Decimal,这是一个固定的精度和缩放数字数据类型。
您也可以指定小数位数。