在javascript中使用小数

时间:2012-09-06 18:48:01

标签: javascript numbers decimal

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

我如何处理脚,以便获得正确的返回值?

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

var inchesIn;
inchesIn = 40;
document.writeln('Feet: ' + Math.floor(inchesIn/12));
document.writeln('Inches: ' + inchesIn%12);

答案 2 :(得分: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
    };
})

0 |作为Math.floor()的替代方案,唯一的“棘手”。如果它让您对可维护性感觉更好,请随意使用Math.floor()。此外,我将响应的“分数”部分四舍五入到最近的100英寸。如果你愿意,你可以更准确地进行舍入,但是鼓励进行一些舍入以防止诸如0.9999999999999994之类的事情或者由于IEEE-754引起的事情变得疯狂。