【问题标题】:Nodejs to MSSQL decimal digits issueNodejs到MSSQL十进制数字问题
【发布时间】:2018-01-23 18:13:49
【问题描述】:

我正在开发一个使用 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"
      }
    }

我尝试将 DB 表中的列定义更改为小数(18,16)并相应地更改模型中的定义,我再次执行了插入,但得到了相同的结果。

关于这种行为以及如何在数据库中获得正确数字的任何解释?

编辑:

我按照 cmets 中的建议进行了更多日志记录,这是一个输出示例:

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

【问题讨论】:

  • >>>"dataType": "float"
  • >>>我尝试将DB表中列的定义更改为十进制(18,16)
  • 我从数据库表中删除了数据,更改了定义并再次执行了插入,但我得到了相同的结果。
  • 您可能需要更多的日志记录来进行研究。您记录了从 csv 读取的数字。在将值发送到模型之前直接添加记录值,例如使用单独的变量。然后为数据库连接器启用环回内置日志记录,您将看到发送到数据库的内容。数据类型映射在这里是一种魔法。以防万一将列创建为decimal(28,16)

标签: javascript sql-server node.js loopback


【解决方案1】:

您在 SQL Server 中使用 Float 数据类型,它是从 -1.79E + 308 到 1.79E + 308 的浮点精度数字数据。所以它不准确。

您应该使用 Decimal,它是一种固定精度和刻度的数字数据类型。

您也可以指定小数位数。

【讨论】:

    猜你喜欢
    • 2017-09-13
    • 1970-01-01
    • 1970-01-01
    • 2014-05-10
    • 2021-08-30
    • 2022-06-21
    • 2018-09-13
    • 1970-01-01
    • 2016-06-02
    相关资源
    最近更新 更多