在我的postgres表中,我有一个类型为numeric (30,16)
的字段,其中我存储了许多小数的数字。我需要计算这些数字。
我正在使用knex
,默认情况下会将这些值返回为String
,所以为了获得数字,我尝试过:
var types = require('pg').types
types.setTypeParser(1700, 'text', parseFloat);
然而,这仍然无法正常工作,例如来自488.1456218300001000
而我减去300
我可以获得类似188.1456218300001500
的内容。
在node.js中我需要做什么来正确处理操作而没有任何舍入错误?
答案 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 :-)