JavaScriptでfloatを整数に変換したいのですが。実際には、標準変換の両方をどのように行うか(切り捨てと四捨五入による)を知りたいです。そして効率的に、文字列への変換や解析を介さずに。
ビットごとの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テスト は、4つのうちMathが現在最も遅いをチェックする追加の記号のためにそれがかなり明白であるところで同じことを比較します。
コメントで述べたように、BITWISE演算子は符号付き32ビット整数を操作するので、大きな数が変換されます。例:
1234567890 | 0 => 1234567890
12345678901 | 0 => -539222987
注:Math.floor()
をtruncateの代わりに使用することはできません。なぜなら、Math.floor(-3.1) = -4
は-3
ではないからです。
切り捨ての正しい置き換えは次のようになります。
function truncate(value)
{
if (value < 0) {
return Math.ceil(value);
}
return Math.floor(value);
}
Double bitwise not 演算子は、floatを切り捨てるために使用できます。あなたが言及した他の操作は Math.floor
、 Math.ceil
、および Math.round
を通して利用可能です。
> ~~2.5
2
> ~~(-1.4)
-1
切り捨ての場合
var intvalue = Math.floor(value);
ラウンドの場合:
var intvalue = Math.round(value);
丸めなしの場合は parseInt メソッドを使用できます。 0x(16進)および0(8進)のプレフィックスオプションがあるため、ユーザー入力には注意してください。
var intValue = parseInt(floatValue, 10);
0によるビットシフト、これは1による除算に相当します
// >> or >>>
2.0 >> 0; // 2
2.0 >>> 0; // 2
あなたの場合、(カンマを挿入するために)末尾に文字列が必要なときは、単にNumber.toFixed()関数を使用することもできます。
ここにはたくさんの提案があります。ビットごとのORは、これまでで最も単純なようです。これは、モジュロ演算子を使用して負の数でも機能するもう1つの短い解決策です。ビット単位のORよりも理解しやすいでしょう。
intval = floatval - floatval%1;
このメソッドは、 '| 0'も '~~'も '>> 0'も正しく動作しない大きな値の数に対しても動作します。
> n=4294967295;
> n|0
-1
> ~~n
-1
> n>>0
-1
> n-n%1
4294967295
もう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.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
あなたがangularjsを使っているなら、HTMLテンプレートバインディングではのように簡単な解決
{{val | number:0}}
valを整数に変換します
docs.angularjs.org/api/ng/filter/number の順に進んでください
JavaScriptでネイティブのMath
オブジェクトを調べると、数値や値などを処理するためのたくさんの関数が得られます。
基本的にあなたがやりたいことはJavaScriptで非常にシンプルでネイティブです...
以下の番号があると想像してください。
const myValue = 56.4534931;
そして今、あなたが最も近い数にそれを切り捨てたいならば、単にそうしなさい:
const rounded = Math.floor(myValue);
そしてあなたが得る:
56
あなたが最も近い数にそれを切り上げたいならば、ちょうどしなさい:
const roundedUp = Math.ceil(myValue);
そしてあなたが得る:
57
また、Math.round
はそれをより高いまたはより低い数に丸めるだけで、どちらがフロート数に近いかによって異なります。
フロート数の後ろに~~
を使用することもできます。これはフロートを整数に変換します。
~~myValue
...のように使うことができます。
私はただ金銭的にあなたが丸くしたい、そして切捨てたくないことを指摘したい。 4.999452 * 100を丸めると5が得られるため、ペニーで降りることはほとんどありません。より代表的な答えです。
そしてそれに加えて、 銀行家の四捨五入 を忘れないでください。