开发者问题收集

试图在JavaScript中绕过对象值

2012-09-05
1106

我有一个看似非常简单的小脚本...

function speedcomp(obj) {
    obj.speedmile.value = 3600 / obj.timesec.value
}

function distcomp(obj) {
    if (obj.speed.value == "")
        obj.speed.value = ((1 * obj.distance.value) / obj.day.value) / 24;
    else if (obj.distance.value == "")
        obj.distance.value = distance.value;
    else if (obj.day.value == "")
        obj.day.value = ((1 * obj.distance.value) / obj.speed.value) / 24;
    obj.hour.value = ((1 * obj.distance.value) / obj.speed.value);
}​

我有 4 个输入类型文本,其 ID 分别为距离、速度、日期和小时。当我输入速度和距离并单击 onclick="distcomp(this.form)" 按钮时,它会很好地帮我计算。

我遇到的问题是尝试将日期和小时的值四舍五入到最接近的 100 位。由于我没有预设值,我发现自己在 Math.round 和 Math.floor 方面遇到了困难。我相信答案是使用 Math.round,但我可以使用一些。

提前谢谢您。

2个回答

您可以只使用 toFixed :

var num = Math.random();
alert(num.toFixed(2));

IE 6 周围存在一些错误的实现,并且 javascript 小数对于某些值并不精确,因此您可能会得到意外的结果:

(0.595).toFixed(2) // 0.59 in Firefox, 0.60 in IE

如果您使用:

Math.round(num*100)/100

那么您将无法获得正确的填充(0.59 => 0.6 而不是 0.60)。 MDN 有一些其他有趣的代码片段。

在回答 如何在 JavaScript 中为 Number.toFixed 编写原型? 时,似乎有一个合理的 toFixed 替代品。

编辑

这是一个合理的 toFixed 函数,我将继续测试以确保它合理地符合 ES5 标准。对于 toFixed(0,2) ,它返回 0.00 ,而规范说的是 0 ,但我认为前者更有用。

function toFixed(num, places) {

    var m, s = '', t;
    num = Number(num);

    if (isNaN(num)) return 'NaN';

    if (num < 0) {
      s = '-';
      num = num * -1;
    }

    m = Math.pow(10, places || 0);
    num = String(Math.round(num * m) / m).split('.');
    t = num[1] || '';
    num[1] = t + (new Array(places - t.length + 1)).join('0');

    return s + num.join('.');
};

Jasper 的评论似乎是一个很好的解决方案:

(Math.round(.595*100)/100).toFixed(2);

尽管 (0).toFixed(2) 给出 0 (根据 EMCA-262)而不是更有用的 0.00 ,这就是为什么上面避免使用 toFixed

RobG
2012-09-05

要四舍五入到最接近的百分位,请将数字乘以 100,调用 Math.round() ,然后再次除以 100。

num=210.653434343
Math.round(num*100)/100
210.65

要四舍五入到百位,请先除法,四舍五入,然后乘法。您也可以将 100 更改为任何其他位置,它都可以。(将 100 更改为 10 以表示十位数和十分位)

sachleen
2012-09-05