toPrecision() 选择舍入方向

问题描述 投票:0回答:2

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
javascript precision
2个回答
1
投票

这不是单衬,但我认为这符合您的要求?你也许可以稍微整理一下。

编辑更新(以相当基本的方式)以使用有效数字而不是小数

编辑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
*/

JS 小提琴链接


0
投票

我知道这是一篇旧帖子,但我一直在做类似的事情。在已知数字大小的情况下,您可以进行简单的减法并按原样使用精度函数。

在我自己的例子中,我试图四舍五入到最近的世纪,所以在使用 toPrecision 函数之前,我将值减少了 50 年,这使得该函数能够产生与您正在寻找的相同的最终结果。在原始帖子的示例中,如果精度始终为 4 位且数字采用 ddd.dd 格式,那么您可以在调用精度函数之前简单地从数字中删除 0.05。同样,如果你想四舍五入,你可以添加 0.05

© www.soinside.com 2019 - 2024. All rights reserved.