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

时间:2017-08-22 12:03:45

标签: javascript node.js bigdecimal

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

我正在使用knex,默认情况下会将这些值返回为String,所以为了获得数字,我尝试过:

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

然而,这仍然无法正常工作,例如来自488.1456218300001000而我减去300我可以获得类似188.1456218300001500的内容。

在node.js中我需要做什么来正确处理操作而没有任何舍入错误?

1 个答案:

答案 0 :(得分:1)

您遇到的问题与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 :-)