[英]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.