在javascript中使用小数

Working with decimals in javascript

本文关键字:小数 javascript      更新时间:2023-09-26

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

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

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

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

您在代码中做了很多工作,试图从微不足道的分数问题中拯救自己。我认为也许更简单越好:

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而变得疯狂的东西。