node.js knex 中带小数和四舍五入的数字

node.js numeric with decimal and roundings in knex

在我的 postgres table 中,我有一个类型为 numeric (30,16) 的字段,我在其中存储带有许多小数位的数字。我需要计算这些数字。

我正在使用 knex,默认情况下它 returns 这些值是 String 所以为了得到数字,我试过:

var types = require('pg').types
types.setTypeParser(1700, 'text', parseFloat);

但是这仍然不能正常工作,例如从 488.1456218300001000 减去 300 我可以获得类似 188.1456218300001500.

的东西

在 node.js 中我需要做什么才能正确处理运算而不会出现任何舍入错误?

您遇到的问题与 knex 或 Postgres 无关,这只是 JavaScript 数字的工作方式——它们的精度不够高,无法处理那么多小数位。

您可以在 this related SO question 中找到更多相关信息。

正如评论中所建议的,如果你真的需要更高的精度,你可以使用像big.js这样的库。

你可以在this fiddle中看到它是如何工作的,看看这个代码示例:

const Big = require('big.js');    

const a = 400.12345678901234567890;
console.log(a - 300); // 100.12345678901232 :-(

const b = new Big('400.12345678901234567890');
console.log(b.minus(300).toString()); // 100.1234567890123456789 :-)