【问题标题】:Working with small decimal points in Javascript在 Javascript 中处理小数点
【发布时间】:2018-08-03 14:19:47
【问题描述】:

我目前正在使用小数点,但 Javascript 似乎一直在四舍五入。

例如,这是我需要完成的计算之一:

(1 + 0.05) ^ (1/12)

这应该返回 1.0040741237836483016054196026721 但是我得到的只是 1。

我尝试使用 Big.js 库,但它仍然只返回 1,我需要这些小数点才能得到准确的结果,有没有办法指定我想要的小数位数?

【问题讨论】:

  • 你能把你用来计算的 JavaScript 贴出来吗?
  • 查看decimal.js。它可能是您正在寻找的更多内容。

标签: javascript


【解决方案1】:

^ 符号在 javascript 中具有 按位异或 语义。见here

下面的代码sn-p告诉你如何得到正确的结果:

console.log(`(1 + 0.05) ^ (1/12) = ${Math.pow((1 + 0.05), (1/12))}`);

【讨论】:

    【解决方案2】:

    正如另一个答案中所述,您可以使用 vanilla JS,但如果您需要精确地执行数学运算,则可以查看 decimal.js 之类的库来帮助保持该精度。

    const vanJS = Math.pow(1 + 0.05, 1/12);
    const decJS = Decimal.pow(1 + 0.05, 1/12).toPrecision(20);
    
    console.log({ vanJS, decJS });
    <script src="https://cdnjs.cloudflare.com/ajax/libs/decimal.js/10.0.1/decimal.min.js"></script>

    【讨论】:

      【解决方案3】:

      您应该始终使用 Math(MDN 官方来源)库进行计算。您可以使用Pow(val, exponential) 功能来发挥自己的优势。

      如果你有 1/2,那么你可以说它是 2^(-1)。这样,您始终可以将 除法 转换为 指数

      Javascript 在精度方面存在一些问题,您将很难处理浮点数。

      var amount  = (1 + 0.05) ^ (1/12);
      var amountPow = Math.pow(1 + 0.05, Math.pow(12,-1));
      console.log((1 + 0.05) ^ (1/12)); // Normal
      console.log(amountPow); // Exponential function Math

      【讨论】:

      • Math.pow 实际上也适用于实指数。所以,你的第二个Math.pow 调用没有错,但因为Math.pow(1 + 0.05, 1/12) === Math.pow(1 + 0.05, Math.pow(12, -1)) 是不必要的。
      • 这是我的观点:adripofjavascript.com/blog/drips/… - “整数除法和小数乘法仍可能导致不精确的值,但基本的整数加法、减法和乘法将是准确的”
      • 我不明白你的帖子是如何说明这一点的,tbh。您的代码不处理浮点精度问题。此外,精度问题不仅限于 JavaScript。例如:200.30 * 3 != 600.90 # True 在 Python 3 中。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-26
      • 1970-01-01
      • 2022-01-20
      相关资源
      最近更新 更多