web-dev-qa-db-ja.com

Javascriptで小数点以下第1位を四捨五入するにはどうすればいいですか?

あなたは、JavaScriptの数字を小数点の後の1文字に丸めることができますか(正しく丸められます)?

* 10、round、/ 10を試しましたが、intの最後に小数点以下2桁が残ります。

300
Walker

Math.round( num * 10) / 10は動作します、これは例です...

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

たとえそれが0であったとしても、小数点以下1桁にしたいのであれば、追加.

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"
592
Billy Moon
var number = 123.456;

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

Math.round(5.01)を使うと、5の代わりに5.0が得られます。

toFixedを使うと 丸めissues に遭遇します。

あなたが両方の長所が欲しいならば、2つを組み合わせてください:

(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);
}
22
Jasper de Vries

lodashにはroundメソッドがあります。

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

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

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

ドキュメント

ソース

22
Kevin Leary

私はtoFixed()に投票します、しかし、記録のために、ここにもう一つの方法があります。それで、それは常にゼロに向かって丸めます(正の数の場合は下に、負の場合は上になります)。

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

しかし、ちょっと、関数呼び出しがないので、それは速く邪悪です。 :)

そして、これは文字列マッチングを使うものです:

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

Sayinだけで、文字列の変形を使用することはお勧めしません。

11
jimbo

これを試してみてください。

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

_ edit _ :こちらを見てください ROUND HALF UPを使って丸める方法。私たちのほとんどが小学校で教えられていた丸めモード

6
atiruz

x =数値、n =小数点以下の桁数

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

ベストアンサーを完成させるには:

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

入力パラメータ番号は、常に数字ではない可能性があります。この場合、.toFixedは存在しません。

3
klodoma
var num = 34.7654;

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

console.log(num); // Logs: 34.8
3
Joseph Silber

承認された回答のES 6バージョン:

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

あなたの方法がうまくいかない場合、plzはあなたのコードを投稿してください。

ただし、四捨五入タスクは次のようにして実行できます。

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

あなたにあげる234.56

同様に

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

234.5をあげる

このようにして、上記で使用されているように、定数の代わりに変数を使用できます。

2
jagbandhuster

誰かがそれを望んでいるならば、少しAngularフィルタ:

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

:)

1
sidonaldson

一般に、丸めはスケーリングによって行われます。round(num / p) * p

指数表記を使用すると、+ ve数の四捨五入が正しく処理されます。ただし、この方法ではEdgeケースを正しく四捨五入できません。

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
1
Amr Ali

これは私が投げかけたものすべてに対して確実に機能するようです。

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
0
Ege Özcan

なぜじゃない

let myNumber = 213.27321;
+myNumber.toFixed(1); // => 213.3
  1. toFixed :固定小数点表記を使用して、指定された数を表す文字列を返します。
  2. 単項プラス(+) :単項プラス演算子は、そのオペランドの前に置き、そのオペランドに評価しますが、まだ数値でない場合は数値に変換しようとします。
0
goulashsoup

Math.round( num * 10) / 10は動作しません。

例えば、1455581777.8-145558160.4はあなたに1310023617.3999999を与えます。

だからnum.toFixed(1)だけを使ってください

0
P.W

適切な切り上げを気にかけているのであれば、

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

そうでなければ、あなたは以前の投稿からの返信を既に持っています。

str.slice(0, -1)
0
jsNovice

数値型を返し、必要な場合にのみ小数を配置する(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);
}
0
Alberto

精度の問題を回避する方法を見つけました。

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

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

ありがとう

0
roy neo