在JavaScript中将小数四舍五入到最接近的百分位

21

我正在使用变量来表示数字,在 JavaScript 中进行简单的数学运算。 下面是我的代码示例:

var ones = 0;
var fives = 0;
function results (){
    _fives = (fives * 5);
    var res = (_fives + ones);
    document.innerHTML = res;
}

这不是完整的代码,但基本上,我让用户输入从1分硬币到100美元钞票的数量。 代码将票据金额乘以票据数量。 这没有问题,可以正常工作......由于某种原因,在一些结果中显示小数,如1.899999999997,不确定如何发生这种情况。

有没有办法更改这样的结果,使其四舍五入到最接近小数点后两位的十分之一?

例如,它不会显示1.89999999997,而只会显示1.90。实际上,这不是一个大问题。 对于我个人来说,我可以自己四舍五入,但学习如何做这件事对于未来的参考是很好的。


2
你尝试了什么?例如,有这个诱人的 Math.round 函数。 - T.J. Crowder
寻找“浮点数算术”。这不仅仅是JavaScript的“问题”。 - elclanrs
3
_fives 现在是一个全局变量。 - Šime Vidas
可能是处理浮点数精度问题的重复问题。 - starblue
8个回答

28

更新: MDN实际上有一个很好的十进制舍入示例,避免了浮点不准确性。可以根据OP的要求修改他们的方法,始终向上舍入。


原始(某些不正确)答案

//to round to n decimal places
function round(num, places) {
    var multiplier = Math.pow(10, places);
    return Math.round(num * multiplier) / multiplier;
}

编辑: 我没有完全阅读问题。由于我们谈论货币,因此可能需要将其四舍五入:

//to round up to two decimal places
function money_round(num) {
    return Math.ceil(num * 100) / 100;
}

这是如何工作的?我应该替换任何内容还是这正是我应该放入我的代码中以将其舍入? - Spencer Carpenter
啊,是的...它不会四舍五入。编辑输入。 - Rodaine
现在来回答你的问题。Javascript的Math.round方法会将数字四舍五入到最近的整数。通过在舍入之前将原始数字乘以十的倍数(每个要保留的小数点一个)然后除以相同的值,您可以保留所需的小数点。这并不能解决浮点数的问题,但至少可以让您打印出漂亮的货币数量。 - Rodaine
现在好像可以了。我不得不稍微调整了一下代码,但现在它完美无缺了 =] 非常感谢! - Spencer Carpenter
这只是大约有效的。它不能四舍五入到精确的小数位数,因为浮点数没有小数位数,它有二进制位数,并且与小数位数不可比。 - user207421
显示剩余2条评论

13

这是我在我正在开发的一个应用程序中个人决定使用的!

const roundToHundredth = (value) => {
  return Number(value.toFixed(2));
};

console.log(roundToHundredth(1.98723232))
console.log(roundToHundredth(3.14159265359))
console.log(roundToHundredth(2.67528))


3
这将会给你一个字符串,所以如果你需要使用一个数字,你可能需要将其解析回来。 - Justin Smith

1

实际上,我一直在处理这个问题,因为我正在开发一个向量项目的舍入解决方案。我很惊讶这个旧的(2011年)javascripter.net 资源还没有出现,特别是它使用了先前提到的Math.round( // ...

我对它进行了一些添加,也利用了.toFixed() (虽然这将去掉任何尾随零,但就我个人而言,我不太担心这个问题):


const round = (number, places) => {
   let rounder = '1';

   for (let i = 0; i < places; i++) {
       rounder += '0';
   }

   return (Math.round(number * rounder) / rounder).toFixed(places);
};

我确定在效率或冗余方面以上代码存在一些问题; 但我的观点是Math.round()仍然可以满足你的需求。在迭代后,可能需要在上述代码中插入转换。

与其他提出的解决方案相比,这也更容易阅读。


0

用于大数小数的四舍五入工具。可以通过为“ decimal ”分配不同的值来调整以处理不同的小数位数。

const roundToWholeNumber = (num, decimal = 100000) => {

    const _roundingHelper = (val, decimalPlace) => {

        return Math.round(val * decimalPlace) / decimalPlace;

    }

    while(decimal > 1){
        num = _roundingHelper(num, decimal)
        decimal = decimal / 10
    }

    return Math.round(num)   
}
roundToWholeNumber(5.44444555)

0

这是 JavaScript 的已知问题,当你做类似以下操作时:

0.1 + 0.5 = 0.600000000001 or 0.599999999998

这个问题的解决方案是使用一个带有固定精度和舍入模式的JavaScript库。你可以尝试使用Scam Link。以下是代码示例:
// Initialization
var bn = new BigNumbers({
    precision: 20, // fixed precision 20 digits after decimal separator 
    roundingMode: BigNumbers.RoundingMode.HALF_UP // rounding mode is Half Up
});

var number1 = bn.of('15');
var number2 = bn.of('12');


var divideResult = number1.divide(number2); // result "1.25"
var multiplyResult = divideResult.multiply(1/2); // result "0.625"
var roundingToTwoDecimalResult = multiplyResult.toPrecision(2); // result "0.63"

(2020年10月后,由于被骗子破坏,已删除提供的外部链接)


0
尝试使用函数来运行舍入系统:
          function roundNumber(num) {
             return Math.round(num * 100) / 100;
            }
           var x = roundNumber(y); //round your variables using the roundNumber function
          


0

使用toFixed一元加号(+)更简单的解决方案:

let twoThirds = 2/3; // number: 0.666666...
let rounded = +twoThirds.toFixed(2); // number: 0.67
console.log({twoThirds,rounded});

这是一个常见的货币格式(例如:$100.67),需要恰好两位小数。因此,我们使用toFixed而不是toPrecision


0

我知道这可能有点晚了,但我也在寻找类似的东西,这个问题让我研究了Math.round功能。

我想出了这个方法,可以成功地将给定值四舍五入到最接近的5分之一、100分之一。所以0.07变成了0.05。23.45变成了23.45。1006.32变成了1006.30。

<script>
function rounder() {
var exampleInput = $("#inputId").val();
$("#output").html(((Math.round(((Math.round(exampleInput*100)/5)*5)/5)*5)/100).toFixed(2));
}
</script>

作为一个新手,我相信有一种方法可以使这段代码更加高效。

虽然你付出了努力,但我认为你现在可以做得更好。 - shieldgenerator7

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接