我有一个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
我如何处理脚,以便获得正确的返回值?
答案 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引起的事情变得疯狂。