繁体   English   中英

在 JavaScript 中四舍五入到最接近的小数点的百分之一

[英]Rounding to the nearest hundredth of a decimal in JavaScript

我正在用 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,这不是什么大问题。 这是个人的事情,我可以自己解决它,但是学习如何做到这一点以供将来参考会很好。

更新: 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;
}

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

 const roundToHundredth = (value) => { return Number(value.toFixed(2)); }; console.log(roundToHundredth(1.98723232)) console.log(roundToHundredth(3.14159265359)) console.log(roundToHundredth(2.67528))

实际上,这种方法并不适用于所有情况。 我正在做一些类似于将测量值四舍五入到一定数量的数字的事情。

在我的例子中,我有一个测量的平均值和标准偏差,比如 0.20812345967 +/- 0.0031647859。 现在显然额外的有效数字是没有意义的,所以我想把它写成 0.208 +/- 0.003。 当我做浮点数学时,我得到 0.20800000000000002 +/- 0.003

通常这四舍五入是正确的,但是因为以十进制为基数的数字有时不能完全存储为二进制,所以你会得到这样的废话。

相反,我要寻找一个字符串格式的解决方案

我知道这可能晚了一天,空了 1 美元,但我也在寻找这样的东西,这个问题让我研究了 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>

作为新手,我确信有一种方法可以使此代码更高效。

当您执行以下操作时,这是 JavaScript 的已知问题:

0.1 + 0.5 = 0.600000000001 or 0.599999999998

此问题的解决方案是使用具有固定精度和舍入模式的 JavasSript 库之一。 你可以试试诈骗链接。 这是代码示例:

// 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 月)

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

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)

我实际上一直在处理这个问题,因为我一直在努力为我正在处理的矢量项目实施舍入解决方案。 我实际上很惊讶这个较旧的(2011 年) javascripter.net资源没有成功,特别是当它使用Math.round( // ...之前提到的。

我已经添加了一点,也使用.toFixed() (虽然这会.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()仍然Math.round()您的需求。 在迭代之后,可能需要在上面抛出一个转换。

与其他一些建议的解决方案相比,它也更容易阅读。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM