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

2020/09/28 22:21 · javascript ·  · 0评论

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

我尝试了* 10,舍入,/ 10,但是它在int末尾保留了两位小数。

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 1 d.p.
// NOTE: .toFixed() returns a string!

// To convert 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"
var number = 123.456;

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

如果使用,Math.round(5.01)您将得到5而不是5.0

如果使用,toFixed则会遇到四舍五入的 问题

如果您想两全其美,请将两者结合起来:

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

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

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

lodash有一个round方法:

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

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

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

文件

来源

我支持toFixed(),但是为了记录,这是另一种使用移位将数字转换为整数的方法。因此,它总是四舍五入(正数为负,负数为负)。

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

但是,嘿,因为没有函数调用,所以速度很快。:)

这是使用字符串匹配的一种:

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

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

试试这个:

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;
}

编辑:请参阅此如何使用圆形半舍入。我们大多数人在小学时教过的舍入模式

为什么不只是

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

使用toPrecision方法:

var a = 1.2345
a.toPrecision(2)

// result "1.2"
var num = 34.7654;

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

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

要完成最佳答案:

var round = function ( number, precision )
{
    precision = precision || 0;
    return parseFloat( parseFloat( number ).toFixed( precision ) );
}

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

ES 6版本的接受答案:

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

通常,十进制舍入是通过缩放来完成的: round(num * p) / p

天真的实现

通过将以下函数与中途编号一起使用,您将获得预期的上舍入值,或者有时根据输入获得下舍入值。

inconsistency在四舍五入可能引入防不胜防,在客户端代码中的bug。

function naiveRound(num, decimalPlaces) {
    var p = Math.pow(10, decimalPlaces);
    return Math.round(num * p) / p;
}

console.log( naiveRound(1.245, 2) );  // 1.25 correct (rounded as expected)
console.log( naiveRound(1.255, 2) );  // 1.25 incorrect (should be 1.26)

更好的实施

通过将数字转换为指数表示形式的字符串,正数将按预期取整。但是,请注意,负数与正数的舍入方式不同。

事实上,其所执行的基本上等同于“圆了一半”作为规则,你会看到,round(-1.005, 2)计算结果为-1,即使round(1.005, 2)计算结果为1.01lodash _.round方法使用这种技术。

/**
 * Round half up ('round half towards positive infinity')
 * Uses exponential notation to avoid floating-point issues.
 * Negative numbers round differently than positive numbers.
 */
function round(num, decimalPlaces) {
    num = Math.round(num + "e" + decimalPlaces);
    return Number(num + "e" + -decimalPlaces);
}

// test rounding of half
console.log( round(0.5, 0) );  // 1
console.log( round(-0.5, 0) ); // 0

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

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

如果要舍入负数时的通常行为,则需要在调用Math.round()之前将负数转换为正数,然后在返回之前将它们转换回负数。

// Round half away from zero
function round(num, decimalPlaces) {
    num = Math.round(Math.abs(num) + "e" + decimalPlaces) * Math.sign(num);
    return Number(num + "e" + -decimalPlaces);
}

有另一种纯数学方法可以执行舍入取整(使用“从零开始的舍入一半”),其中在调用舍入函数之前应用epsilon校正

简单地说,我们将最小的浮点值(= 1.0 ulp;最后一个单位)加到四舍五入前的数字。它移到数字后的下一个可表示的值,远离零。

/**
 * Round half away from zero ('commercial' rounding)
 * Uses correction to offset floating-point inaccuracies.
 * Works symmetrically for positive and negative numbers.
 */
function round(num, decimalPlaces) {
    var p = Math.pow(10, decimalPlaces);
    var e = Number.EPSILON * num * p;
    return Math.round((num * p) + e) / p;
}

// test rounding of half
console.log( round(0.5, 0) );  // 1
console.log( round(-0.5, 0) ); // -1

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

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

这需要抵消在十进制数字编码期间可能发生的隐式舍入误差,尤其是在最后一个十进制位置具有“ 5”的数字,例如1.005、2.675和16.235。实际上,1.005在十进制系统中,编码为1.004999999999999964位二进制浮点数。1234567.005十进制系统则编码为1234567.004999999888241364位二进制浮点数。

值得注意的是,最大二进制round-off error数取决于(1)数字的大小和(2)相对机器ε(2 ^ -52)。

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

但是,您可以按以下方式完成舍入任务:

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

会给你234.56

相似地

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

会给234.5

这样,您可以使用变量代替上面使用的常量。

如果有人需要的话,可以使用小角度过滤器:

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}}

:)

这似乎在我扔给它的任何东西上都能可靠地工作:

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

如果您关心适当的舍入,则:

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

否则,如果您没有,那么您已经收到以前帖子的回复

str.slice(0, -1)

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

例如,1455581777.8-145558160.4给您1310023617.3999999

所以只能用 num.toFixed(1)

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

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
Math.round( mul/count * 10 ) / 10

Math.round(Math.sqrt(sqD/y) * 10 ) / 10

谢谢

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

这一个很好的情况

我制作了一个返回数字类型的代码,并且仅在需要时才放置小数(不填充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) {
    let precisionWithPow10 = Math.pow(10, precision);
    return Math.round(n * precisionWithPow10) / precisionWithPow10;
}
本文地址:http://javascript.askforanswer.com/ruhezaijavascriptzhongsherudaoxiaoshudianhou1wei.html
文章标签: ,  
版权声明:本文为原创文章,版权归 javascript 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!