试图在JavaScript中绕过对象值
我有一个看似非常简单的小脚本...
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,但我可以使用一些。
提前谢谢您。
您可以只使用
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
。
要四舍五入到最接近的百分位,请将数字乘以 100,调用
Math.round()
,然后再次除以 100。
num=210.653434343
Math.round(num*100)/100
210.65
要四舍五入到百位,请先除法,四舍五入,然后乘法。您也可以将 100 更改为任何其他位置,它都可以。(将 100 更改为 10 以表示十位数和十分位)