【问题标题】:Do not strip trailing zeros in JavaScript Decimal constructor不要在 JavaScript Decimal 构造函数中去除尾随零
【发布时间】:2020-08-13 17:24:39
【问题描述】:

我有代表钱的字符串。例如 29.00 或 29.10 或 29.13,货币可以更改,但不一定会导致默认情况下具有两位小数的值(例如日元根本没有小数位)

现在,我使用 Decimal.js 使用这些值执行计算

例如我乘以百分比

let d = new decimal("29.00")
let e = d.mul(0.133333333333).toDP(d.decimalPlaces())

然而,这个结果被舍入到小数点后 0 位,因为构造函数去掉了尾随的零并将 decimalPlaces 设置为 0。

我怎样才能得到一个十进制值,它总是需要输入字符串提供的小数位数?在此示例中,d.decimalPlaces 应返回 2(因为 29.00 必须保留小数位)。

替代解决方案:如何从字符串中提取小数位数?

【问题讨论】:

  • 将其作为字符串传递是否可以解决问题? 29.00 是一个 JavaScript 数字,没有“尾随零”,它只是 29,因为这就是您所要求的。
  • @tadman:这几乎肯定是解决方案;从定义上讲,您无法使用二进制浮点数准确地初始化十进制。我知道的每个十进制包都建议在所有情况下都使用字符串,但简单的小整数初始化除外。
  • 我不会说“二进制”,我会说JavaScript Number,默认情况下它是一个浮点值,并且它们的表示中没有“尾随零”。 2929.029.00000000000000000 都是相同的值。
  • 对不起,我写了我有字符串但没有将它们放入示例中。我更新了问题。我正在用“数字字符串”初始化小数
  • 如前所述。我有来自分贝的钱串。 “29.00”甚至只是“29”现在我乘以 0.13333333 或任何奇数。我需要结果与以前一样具有精确的小数位数。因此,如果它之前是“29.00”,那么它必须是 29*0.1333333= 3.07 之后(“29.00”的 2 个小数位)。但如果数据库只存储“29”,我需要结果是 3 直 ;)

标签: javascript decimal


【解决方案1】:

你是说这个吗?

const keepDecimal = (str,mul) => {
  const dec = str.split(".");
  const numDec = dec.length===2?dec[1].length:0;
  return (str*mul).toFixed(numDec);
}

console.log(keepDecimal("29.13",0.133333333333))
console.log(keepDecimal("29",0.133333333333))

【讨论】:

  • 是的,我猜应该这样做。它不考虑四舍五入,但我可以使用上面的行为小数提供正确的小数位数。我会接受这个作为答案
  • @DennisH。请注意,在任何二进制浮点系统(如 JavaScript)中进行“金钱数学”都是充满危险的。
  • @Pointy 我是这么认为的。但归根结底,这是一个必须在后端执行的 firebase 云功能。它不会经常执行,但当然仍然必须工作。最后,它必须在多个目标之间划分特定数量,所以你看到的就是其中的一部分。我计算百分比将它们相乘,然后检查是否有剩余的“美分”,我在所有目标上平均添加或减去。所以最后我得到一个有效的目标货币金额,其中每个结果最多是一个次要货币单位。我不在“次”货币精度水平上工作
  • 顺便说一句,这也是我使用 decimal.js 的原因,因为据我所知,它工作正常
猜你喜欢
  • 2021-10-15
  • 1970-01-01
  • 2014-09-02
  • 1970-01-01
  • 2020-02-06
  • 2011-11-01
  • 1970-01-01
  • 2021-10-13
相关资源
最近更新 更多