你如何在Javascript中舍入到小数点后1位?

时间:2011-09-08 03:55:47

标签: javascript rounding

你可以将javascript中的数字舍入到小数点后的1个字符(正确舍入)吗?

我尝试了* 10,round,/ 10但它在int的末尾留下了两位小数。

23 个答案:

答案 0 :(得分:593)

Math.round( num * 10) / 10有效,这是一个例子......

var number = 12.3456789;
var rounded = Math.round( number * 10 ) / 10;
// rounded is 12.3

如果你想让它有一个小数位,即使它是0,那么添加......

var fixed = rounded.toFixed(1);
// fixed is always to 1dp
// BUT: returns string!

// to get it back to number format
parseFloat( number.toFixed(2) )
// 12.34
// but that will not retain any trailing zeros

// so, just make sure it is the last step before output,
// and use a number format during calculations!

编辑:添加具有精确功能的循环...

使用这个原理,作为参考,这是一个方便的小圆函数,需要精确...

function round(value, precision) {
    var multiplier = Math.pow(10, precision || 0);
    return Math.round(value * multiplier) / multiplier;
}

......用法......

round(12345.6789, 2) // 12345.68
round(12345.6789, 1) // 12345.7

...默认为舍入到最接近的整数(精度0)...

round(12345.6789) // 12346

...并且可用于舍入到最接近的10或100等...

round(12345.6789, -1) // 12350
round(12345.6789, -2) // 12300

......并正确处理负数......

round(-123.45, 1) // -123.4
round(123.45, 1) // 123.5

...并且可以与toFixed一起格式化为字符串...

round(456.7, 2).toFixed(2) // "456.70"

答案 1 :(得分:83)

var number = 123.456;

console.log(number.toFixed(1)); // should round to 123.5

答案 2 :(得分:23)

如果您使用Math.round(5.01),则会获得5而不是5.0

如果您使用toFixed,则会遇到rounding issues

如果你想要两个世界中最好的结合两者:

(Math.round(5.01 * 10) / 10).toFixed(1)

您可能想为此创建一个函数:

function roundedToFixed(_float, _digits){
  var rounder = Math.pow(10, _digits);
  return (Math.round(_float * rounder) / rounder).toFixed(_digits);
}

答案 3 :(得分:22)

lodashround方法:

_.round(4.006);
// => 4

_.round(4.006, 2);
// => 4.01

_.round(4060, -2);
// => 4100

Docs

Source

答案 4 :(得分:11)

我投票给toFixed(),但是,为了记录,这是另一种使用位移来将数字转换为int的方法。因此,它总是向零舍入(向下为正数,向下为负数)。

var rounded = ((num * 10) << 0) * 0.1;

但是,嘿,因为没有函数调用,所以它很快就邪恶了。 :)

这是一个使用字符串匹配的方法:

var rounded = (num + '').replace(/(^.*?\d+)(\.\d)?.*/, '$1$2');

我不建议使用字符串变体,只是说。

答案 5 :(得分:6)

试试这个:

var original=28.453

// 1.- round "original" to two decimals
var result = Math.round (original * 100) / 100  //returns 28.45

// 2.- round "original" to 1 decimal
var result = Math.round (original * 10) / 10  //returns 28.5

// 3.- round 8.111111 to 3 decimals
var result = Math.round (8.111111 * 1000) / 1000  //returns 8.111

不那么复杂,也更容易实现......

有了这个,你可以创建一个函数:

function RoundAndFix (n, d) {
    var m = Math.pow (10, d);
    return Math.round (n * m) / m;
}

function RoundAndFix (n, d) {
    var m = Math.pow (10, d);
    return Math.round (n * m) / m;
}
console.log (RoundAndFix(8.111111, 3));

编辑:请参阅此How to round using ROUND HALF UP. Rounding mode that most of us were taught in grade school

答案 6 :(得分:4)

x =数字,n =小数位:

function round(x, n) {
    return Math.round(x * Math.pow(10, n)) / Math.pow(10, n)
}

答案 7 :(得分:3)

var num = 34.7654;

num = Math.round(num * 10) / 10;

console.log(num); // Logs: 34.8

答案 8 :(得分:3)

完成最佳答案:

Game *

输入参数编号可能“不”始终为数字,在这种情况下.toFixed不存在。

答案 9 :(得分:2)

如果您的方法不起作用,请发布您的代码。

但是,您可以完成四舍五入任务:

var value = Math.round(234.567*100)/100

会给你234.56

类似地

 var value = Math.round(234.567*10)/10

将给出234.5

通过这种方式,您可以在上面使用的常量位置使用变量。

答案 10 :(得分:2)

使用精确方法:

var a = 1.2345
a.toPrecision(2)

// result "1.2"

答案 11 :(得分:2)

ES 6接受的答案版本:

function round(value, precision) {
    const multiplier = 10 ** (precision || 0);
    return Math.round(value * multiplier) / multiplier;
}

答案 12 :(得分:1)

小角度过滤器,如果有人想要它:

angular.module('filters').filter('decimalPlace', function() {
    return function(num, precision) {
        var multiplier = Math.pow(10, precision || 0);
        return Math.round(num * multiplier) / multiplier;
    };
});

如果通过:

使用
{{model.value| decimalPlace}}
{{model.value| decimalPlace:1}}
{{model.value| decimalPlace:2}}

:)

答案 13 :(得分:1)

通常,通过缩放来完成舍入:round(num / p) * p

使用指数表示法正确处理+ ve数字的舍入。 但是,此方法无法正确舍入边缘情况。

function round(num, precision = 2) {
	var scaled = Math.round(num + "e" + precision);
	return Number(scaled + "e" + -precision);
}

// testing some edge cases
console.log( round(1.005, 2) );  // 1.01 correct
console.log( round(2.175, 2) );  // 2.18 correct
console.log( round(5.015, 2) );  // 5.02 correct

console.log( round(-1.005, 2) );  // -1    wrong
console.log( round(-2.175, 2) );  // -2.17 wrong
console.log( round(-5.015, 2) );  // -5.01 wrong

在这里,我也写了一个函数进行算术舍入,你可以自己测试一下。

/**
 * MidpointRounding away from zero ('arithmetic' rounding)
 * Uses a half-epsilon for correction. (This offsets IEEE-754
 * half-to-even rounding that was applied at the edge cases).
 */

function RoundCorrect(num, precision = 2) {
	// half epsilon to correct edge cases.
	var c = 0.5 * Number.EPSILON * num;
//	var p = Math.pow(10, precision); //slow
	var p = 1; while (precision--> 0) p *= 10;
	if (num < 0)
		p *= -1;
	return Math.round((num + c) * p) / p;
}

// testing some edge cases
console.log(RoundCorrect(1.005, 2));  // 1.01 correct
console.log(RoundCorrect(2.175, 2));  // 2.18 correct
console.log(RoundCorrect(5.015, 2));  // 5.02 correct

console.log(RoundCorrect(-1.005, 2));  // -1.01 correct
console.log(RoundCorrect(-2.175, 2));  // -2.18 correct
console.log(RoundCorrect(-5.015, 2));  // -5.02 correct

答案 14 :(得分:0)

list(a, b, ...)

谢谢

答案 15 :(得分:0)

如果源代码是打字稿,则可以使用如下函数:

public static ToFixedRounded(decimalNumber: number, fractionDigits: number): number {
    var rounded = Math.pow(10, fractionDigits);
    return (Math.round(decimalNumber * rounded) / rounded).toFixed(fractionDigits) as unknown as number;
}

答案 16 :(得分:0)

为什么不只是

let myNumber = 213.27321;
+myNumber.toFixed(1); // => 213.3
  1. toFixed: 返回一个字符串,该字符串使用定点表示法表示给定的数字。
  2. Unary plus (+):一元加号运算符位于其操作数之前,并求值为其操作数,但是尝试将其转换为数字(如果尚未转换为数字)。

答案 17 :(得分:0)

function rnd(v,n=2) {
    return Math.round((v+Number.EPSILON)*Math.pow(10,n))/Math.pow(10,n)
}

这个很好地抓住了拐角处的情况

答案 18 :(得分:0)

我找到了避免精度问题的方法:

function badRound (num, precision) {
    const x = 10 ** precision;
    return Math.round(num * x) / x
}
// badRound(1.005, 2) --> 1

function round (num, precision) {
    const x = 10 ** (precision + 1);
    const y = 10 ** precision;
    return Math.round(Math.round(num * x) / 10) / y
}
// round(1.005, 2) --> 1.01

答案 19 :(得分:0)

我制作了一个返回数字类型的代码,并且仅在需要时才放置小数(无需填充0)。

示例:

roundWithMaxPrecision(11.234, 2); //11.23
roundWithMaxPrecision(11.234, 1); //11.2
roundWithMaxPrecision(11.234, 4); //11.23
roundWithMaxPrecision(11.234, -1); //10

roundWithMaxPrecision(4.2, 2); //4.2
roundWithMaxPrecision(4.88, 1); //4.9

代码:

function roundWithMaxPrecision (n, precision) {
    return Math.round(n * Math.pow(10, precision)) / Math.pow(10, precision);
}

答案 20 :(得分:0)

Math.round( num * 10) / 10不起作用。

例如,1455581777.8-145558160.4会为您提供1310023617.3999999

所以只能使用num.toFixed(1)

答案 21 :(得分:0)

如果你关心正确的四舍五入,那么:

function roundNumericStrings(str , numOfDecPlacesRequired){ 
     var roundFactor = Math.pow(10, numOfDecPlacesRequired);  
     return (Math.round(parseFloat(str)*roundFactor)/roundFactor).toString();  }

如果你不这样做,那么你已经收到了以前帖子的回复

str.slice(0, -1)

答案 22 :(得分:0)

这似乎可以在我投入的任何东西上可靠地运作:

function round(val, multiplesOf) {
  var s = 1 / multiplesOf;
  var res = Math.ceil(val*s)/s;
  res = res < val ? res + multiplesOf: res;
  var afterZero = multiplesOf.toString().split(".")[1];
  return parseFloat(res.toFixed(afterZero ? afterZero.length : 0));
}

它向上舍入,因此您可能需要根据用例进行修改。这应该有效:

console.log(round(10.01, 1)); //outputs 11
console.log(round(10.01, 0.1)); //outputs 10.1