JavaScriptで浮動小数点数を整数に変換したいのですが。実際、私は標準変換の両方を行う方法を知りたいです:切り捨てと丸めによる。そして効率的に、文字列に変換して解析するのではありません。
JavaScriptで浮動小数点数を整数に変換したいのですが。実際、私は標準変換の両方を行う方法を知りたいです:切り捨てと丸めによる。そして効率的に、文字列に変換して解析するのではありません。
回答:
var intvalue = Math.floor( floatvalue );
var intvalue = Math.ceil( floatvalue );
var intvalue = Math.round( floatvalue );
// `Math.trunc` was added in ECMAScript 6
var intvalue = Math.trunc( floatvalue );
// value=x // x=5 5<x<5.5 5.5<=x<6
Math.floor(value) // 5 5 5
Math.ceil(value) // 5 6 6
Math.round(value) // 5 5 6
Math.trunc(value) // 5 5 5
parseInt(value) // 5 5 5
~~value // 5 5 5
value | 0 // 5 5 5
value >> 0 // 5 5 5
value >>> 0 // 5 5 5
value - value % 1 // 5 5 5
負
// value=x // x=-5 -5>x>=-5.5 -5.5>x>-6
Math.floor(value) // -5 -6 -6
Math.ceil(value) // -5 -5 -5
Math.round(value) // -5 -5 -6
Math.trunc(value) // -5 -5 -5
parseInt(value) // -5 -5 -5
value | 0 // -5 -5 -5
~~value // -5 -5 -5
value >> 0 // -5 -5 -5
value >>> 0 // 4294967291 4294967291 4294967291
value - value % 1 // -5 -5 -5
正-数値が大きい
// x = Number.MAX_SAFE_INTEGER/10 // =900719925474099.1
// value=x x=900719925474099 x=900719925474099.4 x=900719925474099.5
Math.floor(value) // 900719925474099 900719925474099 900719925474099
Math.ceil(value) // 900719925474099 900719925474100 900719925474100
Math.round(value) // 900719925474099 900719925474099 900719925474100
Math.trunc(value) // 900719925474099 900719925474099 900719925474099
parseInt(value) // 900719925474099 900719925474099 900719925474099
value | 0 // 858993459 858993459 858993459
~~value // 858993459 858993459 858993459
value >> 0 // 858993459 858993459 858993459
value >>> 0 // 858993459 858993459 858993459
value - value % 1 // 900719925474099 900719925474099 900719925474099
負-数値が大きい
// x = Number.MAX_SAFE_INTEGER/10 * -1 // -900719925474099.1
// value = x // x=-900719925474099 x=-900719925474099.5 x=-900719925474099.6
Math.floor(value) // -900719925474099 -900719925474100 -900719925474100
Math.ceil(value) // -900719925474099 -900719925474099 -900719925474099
Math.round(value) // -900719925474099 -900719925474099 -900719925474100
Math.trunc(value) // -900719925474099 -900719925474099 -900719925474099
parseInt(value) // -900719925474099 -900719925474099 -900719925474099
value | 0 // -858993459 -858993459 -858993459
~~value // -858993459 -858993459 -858993459
value >> 0 // -858993459 -858993459 -858993459
value >>> 0 // 3435973837 3435973837 3435973837
value - value % 1 // -900719925474099 -900719925474099 -900719925474099
var intValue = ~~floatValue;
。表記があなたの好みにあいまいすぎる場合は、関数で非表示にするだけです:function toInt(value) { return ~~value; }
。(これは、必要に応じて文字列を整数に変換します。)
Math.trunc(val);
これは承認された回答なのでコメントします
2.3 - 2.3 % 1
ビットごとのor演算子を使用して浮動小数点の数値を切り捨てることができ、正と負の両方で機能します。
function float2int (value) {
return value | 0;
}
結果
float2int(3.1) == 3
float2int(-3.1) == -3
float2int(3.9) == 3
float2int(-3.9) == -3
以下のパフォーマンスを比較するJSPerfテストを作成しました。
Math.floor(val)
val | 0
ビットごとのOR~~val
ビットごとのNOTparseInt(val)
正の数でのみ機能します。この場合、Math.floor
関数と同様にビット単位の演算を使用しても安全です。
ただし、コードがポジティブとネガティブの両方で機能する必要がある場合は、ビット単位の演算が最も高速です(ORが優先されます)。この他のJSPerfテストは同じことを比較しますが、追加の符号チェックのため、Mathが 4つのうちで最も遅いことが明らかです。
コメントで述べたように、BITWISE演算子は符号付き32ビット整数で動作するため、大きな数が変換されます。例:
1234567890 | 0 => 1234567890
12345678901 | 0 => -539222987
Math.floor()
は、高速です(少なくとも、Google Chromeでの最初のJSPerfテストの実行によると、バージョン30.0.1599.101)、より堅牢です(数値がビットでどのように表されるかに依存しないため、これは、このビットごとのソリューションを変更し、場合によっては壊す可能性があります)、最も重要なのは、より明示的です。
~~
単項演算子なので、より優れています。4.2|0+4
等しい4
が~~4.2+4
等しい8
注:Math.floor()
切り捨ての代わりとして使用することはできませMath.floor(-3.1) = -4
ん-3
。
truncateの正しい置き換えは次のとおりです。
function truncate(value)
{
if (value < 0) {
return Math.ceil(value);
}
return Math.floor(value);
}
Math.trunc(value)
ECMAScript 6
floor
-∞にtruncate
向かって丸め、ゼロに向かって丸めます。(ceil
+無限大に丸めます)。
double ビット単位のnot演算子を使用して、floatを切り捨てることができます。あなたが言及した他の操作ができているMath.floor
、Math.ceil
とMath.round
。
> ~~2.5
2
> ~~(-1.4)
-1
<canvas>
JSのフォントレンダリングエンジンを。ありがとうございました!
切り捨ての場合:
var intvalue = Math.floor(value);
ラウンド:
var intvalue = Math.round(value);
parseIntメソッドを使用して丸めを行わないことができます。0x(16進数)および0(8進数)の接頭辞オプションのため、ユーザー入力に注意してください。
var intValue = parseInt(floatValue, 10);
parseInt(1000000000000000000000, 10);
結果は1 000 000 000 000 000 000 000ではなく1になります。とにかく、質問は明示的に望んでいませんでした "文字列に変換して解析することをが、それは比較的マイナーです...;)
parseInt()
期待するためです。この整数を渡すと、整数に変換されてから解析され、結果はになります。1e21
parseInt
1e21
1
1による除算と同等の0によるビットシフト
// >> or >>>
2.0 >> 0; // 2
2.0 >>> 0; // 2
>> 0
<整数に対してのみ働くようで2 ^ 31-1、および>>> 0
整数<ために2 ^ 32-1。これは、大きい値に対しては0を返します
あなたの場合、最後に文字列が必要な場合(コンマを挿入するため)、Number.toFixed()
関数を使用することもできますが、これにより丸めが実行されます。
ここには多くの提案があります。ビット単位のORは、はるかに単純なようです。これは、モジュロ演算子を使用して負の数でも機能する別の短い解決策です。おそらくビット単位のORよりも理解しやすいでしょう。
intval = floatval - floatval%1;
このメソッドは、 '| 0'も '~~'も '>> 0'も正しく機能しない高い値の数値でも機能します。
> n=4294967295;
> n|0
-1
> ~~n
-1
> n>>0
-1
> n-n%1
4294967295
するには切り捨て:
// Math.trunc() is part of the ES6 spec
Math.trunc( 1.5 ); // returns 1
Math.trunc( -1.5 ); // returns -1
// Math.floor( -1.5 ) would return -2, which is probably not what you wanted
ラウンド:
Math.round( 1.5 ); // 2
Math.round( 1.49 ); // 1
Math.round( -1.6 ); // -2
Math.round( -1.3 ); // -1
もう1つの可能な方法— XOR演算を使用します。
console.log(12.3 ^ 0); // 12
console.log("12.3" ^ 0); // 12
console.log(1.2 + 1.3 ^ 0); // 2
console.log(1.2 + 1.3 * 2 ^ 0); // 3
console.log(-1.2 ^ 0); // -1
console.log(-1.2 + 1 ^ 0); // 0
console.log(-1.2 - 1.3 ^ 0); // -2
ビット演算の優先度は数学演算の優先度よりも低く、便利です。https://jsfiddle.net/au51uj3r/でお試しください
Math
JavaScriptでネイティブオブジェクトを調べると、一連の関数全体で数値や値などを処理できます。
基本的にあなたがしたいことは非常に単純でJavaScriptでネイティブです...
以下の番号があるとします。
const myValue = 56.4534931;
そして、最も近い数値に切り捨てる場合は、次のようにします。
const rounded = Math.floor(myValue);
そしてあなたは得る:
56
四捨五入したい場合は、次のようにします。
const roundedUp = Math.ceil(myValue);
そしてあなたは得る:
57
また Math.round
それをより高い数値またはより低い数値に丸めることは、どちらがフロット数に近いかに依存します。
また使用できます ~~
、float後ろて、floatを整数に変換する。
次のように使用できます~~myValue
...
~~
数がint 32制限より大きい場合は、値がint 32制限値に変更されるため、注意してください。
切り捨てではなく、金銭的に丸めたいことを指摘したいだけです。ペニーによってオフになっている可能性ははるかに低くなります。4.999452* 100を丸めると、より代表的な答えである5が得られるからです。
その上で、銀行の丸めも忘れないでください。これは、直線的な丸めがもたらすわずかにプラスのバイアスに対抗する方法です。金融アプリケーションではそれが必要になる場合があります。
angularjsを使用している場合は、HTMLテンプレートバインディングで次のような簡単な解決策
{{val | number:0}}
valを整数に変換します