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 :-)
在我的 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 :-)