【问题标题】:Working with decimals in javascript在 javascript 中处理小数
【发布时间】:2012-09-06 18:48:01
【问题描述】:

我有一个 javascript 函数,可以将英尺转换为可用对象,该对象将获取总英尺并将其分解为英尺/英寸/分数。

在下面的例子中,小数部分应该是零,我的英寸应该是 4

假设我有以下内容。

var inches = 40;

现在当我像这样调用下面的函数时 unPackDecimalFeet(40 /12);

  unPackDecimalFeet: function (feetInchFraction) {

        var inchFraction = (feetInchFraction - ~~feetInchFraction) * 12;
        return {
            feet: ~~feetInchFraction,
            inch: ~~inchFraction,
            fraction: inchFraction - ~~inchFraction
        };
    }

我的返回值如下。

feet: 3
fraction: 0.9999999999999964
inch: 3

**上面的返回值应该是这样的。

feet: 3
fraction: 0
inch: 4

我需要如何处理脚才能得到正确的返回值?

【问题讨论】:

    标签: javascript numbers decimal


    【解决方案1】:

    我会说一开始乘以1000,然后进行计算,然后除以1000。 IEEE 浮点算法是这里的问题。如果您需要更多计算,请查看 BigInteger 库。 (有时是 BigInt)

    【讨论】:

    • 你能不能给我一个分解。
    【解决方案2】:
    var inchesIn;
    inchesIn = 40;
    document.writeln('Feet: ' + Math.floor(inchesIn/12));
    document.writeln('Inches: ' + inchesIn%12);
    

    【讨论】:

      【解决方案3】:

      您做了很多工作,试图让自己免于代码中微小的无关紧要的分数问题。我认为也许更简单更好:

      unPackDecimalFeet : (function (feet) {
          var flooredFeet = 0 | feet,
              flooredInches = 0 | ((feet - flooredFeet) * 12),
              inchFraction = (feet * 12) - (0 | (feet * 12));
      
          return {
              feet: flooredFeet,
              inch: flooredInches,
              fraction: +(inchFraction.toFixed(2)) //Rounded to two decimals
          };
      })
      

      唯一的“技巧”是0 | 作为Math.floor() 的替代品。如果您对可维护性感觉更好,请随意使用Math.floor()。此外,我将响应的“分数”部分四舍五入到最接近的 100 英寸。您可以根据需要进行更精确的舍入,但建议进行一些舍入以防止出现 0.9999999999999994 或任何由于 IEEE-754 导致的问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多