javascript - Nodejs 到 MSSQL 十进制数字问题

标签 javascript sql-server node.js loopback

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

相关文章:

javascript - 删除背景形状轮廓并创建列空间(CSS)

javascript - Ag-grid-Enterprise 使用按钮展开/折叠所有行?非常慢的崩溃 FF 和 Edge

javascript - php中javascript按钮上的innerHTML null

javascript - 如何从 <tr >'s double-click listener to a <button>' s 点击监听器传递 JS 对象?

c# - 无法在 C# 中创建连接字符串

node.js - apt-get install -y nginx 更新版本

node.js - 通过 WebSocket 连接发送 HTML 是一种不好的做法吗

sql - 是否可以从 SQL Server 触发器向 MySQL 插入数据?

mysql - 数据库模式关系和例程关系的工具

node.js - 将 Gulp 任务设置为默认任务