我正在开发一个使用 Node.js 的 Loopback 框架开发的应用程序。我需要从 csv 读取数据并将其保存在我的 SQL Server 数据库上(我使用的是 SQL Server 2014 实例)。 csv 文件的一列包含 16 位十进制数字。我从 csv 文件读取它们没有问题,但是当我将它们保存在数据库上时,它会更改最后的十进制数字。例如,csv的第一行的值为“0.0059888523696288”,但在数据库中我找到“0.0059888525865972”。
我在 JavaScript 代码中执行了 console.log 来检查数字,并且它们打印正确,因此我猜测当数据库读取数据时会发生问题。
这是我的 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"
}
}
我尝试将数据库表中的列定义更改为decimal(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
存储在数据库中的值:0.0045747025869787
即使将列更改为十进制 (28,16),我也得到相同的输出。这很奇怪。
最佳答案
您在SQL Server中使用Float数据类型,它是从-1.79E + 308到1.79E + 308的 float 精度数字数据。所以它不精确。
您应该使用 Decimal,它是一种固定精度和小数位数的数字数据类型。
您还可以指定小数位数。
关于javascript - Nodejs 到 MSSQL 十进制数字问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48301881/