JavaScriptで小数点第1位をどのように丸めますか?


378

JavaScriptで数値を小数点以下1文字に丸めることができますか(正しく丸められます)?

私は* 10、丸め、/ 10を試しましたが、intの最後に小数点以下2桁が残っています。


9
Math.round(n * 10) / 10動作します。あなたのコードは何ですか?
ベンフレミング

回答:


729

Math.round(num * 10) / 10 作品、ここに例があります...

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

小数点以下1桁にしたい場合は、それが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"

45
.toFixed()数値が必要な場合に文字列を返すため、使用には注意してください。
コビー

1
それが整数(ゼロ)の場合、明らかに、使用parseFloatすると、残りの小数が削除され.toFixed()ます。一般に、計算を行いたい場合は、最初の例に従うことが最善です。UIに数値を表示する場合は、を使用します.toFixed()
コビー2012

うーん...それは理にかなっています。数値に変換する方法では、常にエラーのあるゼロを取り除く必要があるため、文字列のままにする必要があります。これは常に表示前の最後のステップであり、計算では使用されないはずです。
ビリームーン

2
.toFixed()ブラウザによって異なる丸め結果が返される可能性があるため、使用には注意してください。トピックの詳細については、この投稿を読んでください!
Wilt

1
DPが存在しない場合、ゼロを追加できますか?
Nick

102
var number = 123.456;

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

4
時々toFixed()グリッチがあります-私がそれを私が呼び出すChromeブラウザで見たtoFixed()後、文字列に変換しました、そしてそれは次のようなものを示しています10.00000000068-奇妙です。これを確実に再現することはできません。
Hamish Grubijan 2013

はい、小数点以下がわずかであっても、toFixed()を使用して不具合を説明しました。私が正しく思い出せば、分数4を低い値ではなく次に大きい値に丸めました。
Dalibor 2015年

1
上記の@cobbyで述べたように、多分必要なときに.toFixed()aを返すので注意して使用してStringくださいNumber
Ricardo

28

使用Math.round(5.01)すると、の5代わりに取得されます5.0

使用toFixedすると、丸めの 問題が発生します

両方の世界で最高のものを必要とする場合は、2つを組み合わせます。

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

なぜパラメータのアンダースコア、つまり(_float、_digits)?自分で答えを見つけられるリンクを投稿してください。ありがとう
Shark Lasers


11

私はに投票しましたtoFixed()が、念のため、ビットシフトを使用して数値をintにキャストする別の方法を示します。したがって、常にゼロに向かって丸められます(正の数の場合は切り下げ、負の数の場合は切り上げ)。

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

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

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

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

文字列バリアントの使用はお勧めしません。ただ言うだけです。


7

これで試してください:

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

編集ROUND HALF UPを使用して丸める方法を参照してください。私たちのほとんどが小学校で教えられた丸めモード


いいえ:RoundAndFix(1.005、2)。
Noyo、

4

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

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

いいえ:round(1.005、2)。
Noyo、

4

なぜか

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


3

ベストアンサーを完了するには:

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

入力パラメータ番号は常に数値であるとは限りません。この場合、.toFixedは存在しません。


3

承認済み回答のES 6バージョン:

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

3

toPrecisionメソッドの使用:

var a = 1.2345
a.toPrecision(2)

// result "1.2"

私が試した中でこれまでで最高の答えです。ありがとう。
サント

ですので注意が必要12.345.toPrecision( 2 )です"12"
Joshua Pinter

2

メソッドが機能しない場合は、コードを投稿してください。

ただし、次のように丸めタスクを実行できます。

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

234.56を提供します

同様に

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

234.5を与える

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


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

:)


1

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

指数表記を使用すると、+ ve数の丸めが正しく処理されます。ただし、この方法では-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

ここでも、算術四捨五入を行うために私が書いた関数が1つあります。自分でテストできます。

/**
 * 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


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

0

適切な切り上げが気になる場合:

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

そうでない場合は、以前の投稿からの返信があります。

str.slice(0, -1)

0

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

たとえば、1455581777.8-145558160.4あなたに与えます1310023617.3999999

だから使うだけ num.toFixed(1)


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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.