JavaScriptで数値を小数点以下1文字に丸めることができますか(正しく丸められます)?
私は* 10、丸め、/ 10を試しましたが、intの最後に小数点以下2桁が残っています。
JavaScriptで数値を小数点以下1文字に丸めることができますか(正しく丸められます)?
私は* 10、丸め、/ 10を試しましたが、intの最後に小数点以下2桁が残っています。
回答:
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"
.toFixed()
数値が必要な場合に文字列を返すため、使用には注意してください。
parseFloat
すると、残りの小数が削除され.toFixed()
ます。一般に、計算を行いたい場合は、最初の例に従うことが最善です。UIに数値を表示する場合は、を使用します.toFixed()
。
var number = 123.456;
console.log(number.toFixed(1)); // should round to 123.5
toFixed()
グリッチがあります-私がそれを私が呼び出すChromeブラウザで見たtoFixed()
後、文字列に変換しました、そしてそれは次のようなものを示しています10.00000000068
-奇妙です。これを確実に再現することはできません。
.toFixed()
aを返すので注意して使用してString
くださいNumber
使用Math.round(5.01)
すると、の5
代わりに取得されます5.0
。
両方の世界で最高のものを必要とする場合は、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);
}
私はに投票しましたtoFixed()
が、念のため、ビットシフトを使用して数値をintにキャストする別の方法を示します。したがって、常にゼロに向かって丸められます(正の数の場合は切り下げ、負の数の場合は切り上げ)。
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;
}
toPrecisionメソッドの使用:
var a = 1.2345
a.toPrecision(2)
// result "1.2"
12.345.toPrecision( 2 )
です"12"
。
メソッドが機能しない場合は、コードを投稿してください。
ただし、次のように丸めタスクを実行できます。
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}}
:)
一般的に、丸めはスケーリングによって行われます。 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
これは、私がそれに投げかけたものすべてで確実に機能するようです:
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パディングなし)。
例:
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);
}
精度の問題を回避する方法を見つけました:
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(n * 10) / 10
動作します。あなたのコードは何ですか?