あなたは、JavaScriptの数字を小数点の後の1文字に丸めることができますか(正しく丸められます)?
* 10、round、/ 10を試しましたが、intの最後に小数点以下2桁が残ります。
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"
var number = 123.456;
console.log(number.toFixed(1)); // should round to 123.5
Math.round(5.01)
を使うと、5
の代わりに5.0
が得られます。
あなたが両方の長所が欲しいならば、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);
}
私はtoFixed()
に投票します、しかし、記録のために、ここにもう一つの方法があります。それで、それは常にゼロに向かって丸めます(正の数の場合は下に、負の場合は上になります)。
var rounded = ((num * 10) << 0) * 0.1;
しかし、ちょっと、関数呼び出しがないので、それは速く邪悪です。 :)
そして、これは文字列マッチングを使うものです:
var rounded = (num + '').replace(/(^.*?\d+)(\.\d)?.*/, '$1$2');
Sayinだけで、文字列の変形を使用することはお勧めしません。
これを試してみてください。
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を使って丸める方法。私たちのほとんどが小学校で教えられていた丸めモード
x =数値、n =小数点以下の桁数
function round(x, n) {
return Math.round(x * Math.pow(10, n)) / Math.pow(10, n)
}
ベストアンサーを完成させるには:
var round = function ( number, precision )
{
precision = precision || 0;
return parseFloat( parseFloat( number ).toFixed( precision ) );
}
入力パラメータ番号は、常に数字ではない可能性があります。この場合、.toFixedは存在しません。
var num = 34.7654;
num = Math.round(num * 10) / 10;
console.log(num); // Logs: 34.8
承認された回答のES 6バージョン:
function round(value, precision) {
const multiplier = 10 ** (precision || 0);
return Math.round(value * multiplier) / multiplier;
}
あなたの方法がうまくいかない場合、plzはあなたのコードを投稿してください。
ただし、四捨五入タスクは次のようにして実行できます。
var value = Math.round(234.567*100)/100
あなたにあげる234.56
同様に
var value = Math.round(234.567*10)/10
234.5をあげる
このようにして、上記で使用されているように、定数の代わりに変数を使用できます。
誰かがそれを望んでいるならば、少し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}}
:)
一般に、丸めはスケーリングによって行われます。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
これは私が投げかけたものすべてに対して確実に機能するようです。
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
Math.round( num * 10) / 10
は動作しません。
例えば、1455581777.8-145558160.4
はあなたに1310023617.3999999
を与えます。
だからnum.toFixed(1)
だけを使ってください
適切な切り上げを気にかけているのであれば、
function roundNumericStrings(str , numOfDecPlacesRequired){
var roundFactor = Math.pow(10, numOfDecPlacesRequired);
return (Math.round(parseFloat(str)*roundFactor)/roundFactor).toString(); }
そうでなければ、あなたは以前の投稿からの返信を既に持っています。
str.slice(0, -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( mul/count * 10 ) / 10
Math.round(Math.sqrt(sqD/y) * 10 ) / 10
ありがとう