Nodejs到MSSQL十进制数字问题

时间:2018-01-17 13:04:40

标签: javascript sql-server node.js loopback

我正在使用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),我也得到了相同的输出。这很奇怪。

1 个答案:

答案 0 :(得分:0)

您正在SQL服务器中使用Float数据类型,这是一个从-1.79E + 308到1.79E + 308的浮动精度数字数据。所以这不完全正确。

你应该使用Decimal,这是一个固定的精度和缩放数字数据类型。

您也可以指定小数位数。