1

我有一个 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

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

4

3 回答 3

1

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

于 2012-09-06T18:51:09.980 回答
0
var inchesIn;
inchesIn = 40;
document.writeln('Feet: ' + Math.floor(inchesIn/12));
document.writeln('Inches: ' + inchesIn%12);
于 2012-09-06T19:28:56.000 回答
0

您正在做很多工作来尝试将自己从整个代码中微小的无关紧要的分数问题中拯救出来。我认为也许更简单更好:

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
    };
})

唯一的“技巧”是 with0 |作为Math.floor(). Math.floor()如果它让您对可维护性感觉更好,请随意使用。此外,我将响应的“分数”部分四舍五入到最接近的 100 英寸。如果需要,您可以更精确地舍入,但鼓励进行一些舍入以防止0.9999999999999994由于 IEEE-754 变得疯狂或其他任何事情。

于 2012-09-06T19:42:59.283 回答