16

I'm doing simple math in JavaScript using variables to represent the numbers. Here is an example of my code:

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

This isn't the full code but basically I'm having the user enter the amount of bills and coins from 1 cent coins up to $100 bills. The code multiplies the amount of bills to the amount the bill is worth. This is no problem works just fine... For some reason on some of my results it shows a decimal like 1.899999999997 not sure how this is happening.

Is there a way to change this so it round to the nearest hundredth of a decimal?

For example instead of it showing 1.89999999997 it would just show 1.90 in reality this isn't a big issue. This is a personal thing that I can just round it myself however it would be nice to learn how to do this for future reference.

4

7 回答 7

25

更新: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;
}
于 2013-02-19T22:22:41.300 回答
7

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

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

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

于 2020-03-26T14:43:31.563 回答
2

实际上,这种方法并非在所有情况下都有效。我正在做类似于将测量值四舍五入到一定位数的事情。

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

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

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

于 2014-01-30T23:12:44.530 回答
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>

作为一个新手,我确信有办法让这段代码更有效率。

于 2015-08-20T12:56:02.587 回答
0

实际上,我一直在处理这个问题,因为我一直在努力为我正在从事的向量项目实施舍入解决方案。实际上,我很惊讶这个较旧的(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()仍然可以满足您的需要。在迭代之后,可能需要在上面进行转换。

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

于 2019-02-23T00:54:26.050 回答
0

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

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)
于 2018-10-24T06:02:00.603 回答
0

当您执行以下操作时,这是 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 月)

于 2018-08-04T05:50:42.670 回答