省钱为整数

时间:2016-06-14 13:49:27

标签: javascript node.js mongodb mongoose

我们在Mongoose模式中有以下代码尝试将money转换为整数以保存在MongoDB中:

amount: { type: Number, get: getAmount, set: setAmount, required: true}

function setAmount(num) {
  return num * 100;
}

function getAmount(num) {
  return (num / 100).toFixed(2);
}

无论如何保存64.49,我们仍然会在MongoDB文档中使用它:

"amount": 6448.999999999999

我们如何解决这个问题?

3 个答案:

答案 0 :(得分:3)

为了避免这些精确问题" money"变量,我总是使用"美分"作为单位。

不要存储15.24美元,在您的代码中存储1524美分。

然后使用整数执行所有操作。

然后使用美分=>美元转换仅用于显示,通过添加"。"最后两个字符前的分隔符。

答案 1 :(得分:0)

考虑使用BigNumber:http://mikemcl.github.io/bignumber.js/

小例子(在控制台中):

> 0.2 * 0.4
< 0.08000000000000002

使用BigNumber

> var a = new BigNumber(0.2);
> var b = new BigNumber(0.4);
> var c = a.times(b);
> c.valueOf();
< "0.08"

答案 2 :(得分:0)

这是否满足您的需求?

function convert(number) {
    const [i, d] = ('' + number).split(/\./);
    const a = +i * 100;
    const b = +(d || '0').slice(0, 2);
    const c = +(d || '0').slice(2)? 1 : 0;
    return a + b + c;
}

这是旧版本没有整理尾随.0099999

function convert(number) {
    const [a, b] = ('' + number).split(/\./);
    return +a * 100 + +(b || '0').slice(0, 2);
}

它收到1个数字并返回相同的数字乘以100.