当前位置: 首页 > 知识库问答 >
问题:

如有必要,如何四舍五入到最多两位小数

凌俊材
2023-03-14

我想最多四舍五入两位小数,但只有在必要的时候。

输入:

10
1.7777777
9.1

输出:

10
1.78
9.1

如何在JavaScript中做到这一点?

共有3个答案

印晋
2023-03-14

您可以使用

function roundToTwo(num) {
    return +(Math.round(num + "e+2")  + "e-2");
}

我在MDN上找到了这个。他们的方式避免了前面提到的1.005的问题。

roundToTwo(1.005)
1.01
roundToTwo(10)
10
roundToTwo(1.7777777)
1.78
roundToTwo(9.1)
9.1
roundToTwo(1234.5678)
1234.57
叶鹭洋
2023-03-14

如果值是文本类型:

parseFloat("123.456").toFixed(2);

如果值是数字:

var numb = 123.23454;
numb = numb.toFixed(2);

有一个缺点是,像1.5这样的值将给出“1.50”作为输出。@minitech建议的修复:

var numb = 1.5;
numb = +numb.toFixed(2);
// Note the plus sign that drops any "extra" zeroes at the end.
// It changes the result (which is a string) into a number again (think "0 + foo"),
// which means that it uses only as many digits as necessary.

似乎Math.round是一个更好的解决方案。但事实并非如此!在某些情况下,它不会正确舍入:

Math.round(1.005 * 100)/100 // Returns 1 instead of expected 1.01!

toFixed()在某些情况下也不会正确舍入(在Chrome v.55.0.2883.87中测试)!

示例:

parseFloat("1.555").toFixed(2); // Returns 1.55 instead of 1.56.
parseFloat("1.5550").toFixed(2); // Returns 1.55 instead of 1.56.
// However, it will return correct result if you round 1.5551.
parseFloat("1.5551").toFixed(2); // Returns 1.56 as expected.

1.3555.toFixed(3) // Returns 1.355 instead of expected 1.356.
// However, it will return correct result if you round 1.35551.
1.35551.toFixed(2); // Returns 1.36 as expected.

我猜,这是因为1.555实际上是类似于幕后浮动1.55499994的东西。

解决方案1是使用具有所需舍入算法的脚本,例如:

function roundNumber(num, scale) {
  if(!("" + num).includes("e")) {
    return +(Math.round(num + "e+" + scale)  + "e-" + scale);
  } else {
    var arr = ("" + num).split("e");
    var sig = ""
    if(+arr[1] + scale > 0) {
      sig = "+";
    }
    return +(Math.round(+arr[0] + "e" + sig + (+arr[1] + scale)) + "e-" + scale);
  }
}

它也在Plunker。

注意:这不是一个适用于所有人的通用解决方案。有几种不同的舍入算法。您的实现可能会有所不同,这取决于您的需求。另请参见舍入。

解决方案2是避免前端计算,并从后端服务器提取舍入值。

另一种可能的解决方案,也不是防弹的。

Math.round((num + Number.EPSILON) * 100) / 100

在某些情况下,当您对1.3549999999998这样的数字进行四舍五入时,将返回不正确的结果。它应该是1.35,但结果是1.36。

翟丰茂
2023-03-14

使用Math.round()

Math.round(num * 100) / 100

或者更具体地说,为了确保像1.005轮这样的东西正确,请使用数字。ε:

Math.round((num + Number.EPSILON) * 100) / 100
 类似资料:
  • 我最多取小数点后2位四舍五入,但只限于必要时。 输入: 输出: 我如何在JavaScript中做到这一点?

  • 我如何四舍五入到两个小数位?

  • 问题内容: 如果值为,则应将其格式化为。如果是,那么应该是。 问题答案: 这是一个实用程序,可以将双精度舍入(而不是截断)双精度至小数位数。 例如: 原始版本;提防这个 这在小数位数很高(例如)或整数部分很大(例如)的极端情况下会严重崩溃。感谢Sloin指出这一点。 多年来,我一直在使用上面的方法将“不太大”的双精度取整到2或3个小数位(例如,以秒为单位的清理时间用于记录目的:27.9876543

  • 我试图将大的十进制值四舍五入到小数点后两位。 我正在使用 但它并没有始终如一地满足我的要求: 我不在乎有效数字,我只想要小数点后两位。我如何使用BigDecimal做到这一点?或者还有其他类/库更适合这个?

  • 问题内容: 我想最多舍入小数点后两位,但 仅在必要时才可以 。 输入: 输出: 如何在JavaScript中执行此操作? 问题答案: 使用 编辑: 为了确保像1.005这样的东西正确取整,我们使用

  • 如果计算结果为164.98001,那么我希望答案显示为164.99。 编辑-我不认为这是一个重复的问题,因为我的问题涉及到四舍五入所有的数字。