Javascript 的 toPrecision 向上舍入一半所以
(123.46).toPrecision(4) // 123.5
(123.44).toPrecision(4) // 123.4
但是选择舍入方向(向上/向上或向下/向下)的直接方法是什么?所以
(123.46).toPrecisionFloor(4) // would give 123.4
(123.44).toPrecisionCeil(4) // 123.5
这不是单衬,但我认为这符合您的要求?你也许可以稍微整理一下。
编辑更新(以相当基本的方式)以使用有效数字而不是小数
编辑2对代码进行了一些修改并添加了进一步的测试
/**
* rounds a number up or down to specified accuracy
* @param number {numeric} number to perform operations on
* @param precision {numeric} number of significant figures to return
* @param direction {string} wether to round up or down
*/
function toPrecision(number, precision, direction) {
precision -= Math.floor(number).toString().length;
var order = Math.pow(10, precision);
number *= order;
var option = (direction === 'down' ? 'floor' : 'ceil');
return (Math[option].call(null, number) / order);
}
// values to test
var test_1 = 123.567891;
var test_2 = 15000;
var test_3 = 12340000;
// define tests
var tests = {
"a": [test_1, 3, "down"],
"b": [test_1, 4, "up"],
"c": [test_2, 3, "down"],
"d": [test_2, 4, "up"],
"e": [test_2, 1, "down"],
"f": [test_2, 1, "up"],
"g": [test_3, 4, "down"],
"h": [test_3, 4, "up"]
}
// loop over tests and execute
for (var key in tests) {
console.log("key:", key, "result: ", toPrecision.apply(null, tests[key]));
}
/*
Test results:
key: a result: 123
key: b result: 123.6
key: c result: 15000
key: d result: 15000
key: e result: 10000
key: f result: 20000
key: g result: 12340000
key: h result: 12340000
*/
我知道这是一篇旧帖子,但我一直在做类似的事情。在已知数字大小的情况下,您可以进行简单的减法并按原样使用精度函数。
在我自己的例子中,我试图四舍五入到最近的世纪,所以在使用 toPrecision 函数之前,我将值减少了 50 年,这使得该函数能够产生与您正在寻找的相同的最终结果。在原始帖子的示例中,如果精度始终为 4 位且数字采用 ddd.dd 格式,那么您可以在调用精度函数之前简单地从数字中删除 0.05。同样,如果你想四舍五入,你可以添加 0.05