web-dev-qa-db-ja.com

JavaScriptで数値の小数部分を取得する

3.21.6のような浮動小数点数があります。

数字を整数部分と小数部分に分ける必要があります。たとえば、3.2の値は2つの数字、つまり30.2に分割されます。

整数部分を取得するのは簡単です。

n = Math.floor(n);

しかし、私は小数部分を取得するのに苦労しています。私はこれを試しました:

remainer = n % 2; //obtem a parte decimal do rating

しかし、それは常に正しく機能するわけではありません。

前のコードの出力は以下のとおりです。

n = 3.1 => remainer = 1.1

ここで何が足りないの?

205
Oscar

1ではなく2を使用してください。

js> 2.3 % 1
0.2999999999999998
304
var decimal = n - Math.floor(n)

これはマイナスの数値ではうまくいきませんが、しなければならない可能性があります。

n = Math.abs(n); // Change to positive
var decimal = n - Math.floor(n)
80
greenimpala

あなたは文字列に変換できますよね?

n = (n + "").split(".");
67
sdleihssirhc

0.2999999999999998はどのように受け入れられますか。私が質問者であれば、私は0.3の答えが欲しいでしょう。私たちがここで持っているのは誤った精度です、そして私のfloor、%などの実験はJavascriptがこれらの操作のための誤った精度を好むことを示しています。だから私は文字列への変換を使用している答えは正しい軌道に乗っていると思います。

私はこれをするだろう:

var decPart = (n+"").split(".")[1];

具体的には、100233.1を使用していましたが、答えは「.1」でした。

29
jomofrodo

簡単な方法は次のとおりです。

var x = 3.2;
var decimals = x - Math.floor(x);
console.log(decimals); //Returns 0.20000000000000018

残念ながら、それは正確な値を返しません。しかし、それは簡単に修正されます。

var x = 3.2;
var decimals = x - Math.floor(x);
console.log(decimals.toFixed(1)); //Returns 0.2

小数点以下の桁数がわからない場合はこれを使用できます。

var x = 3.2;
var decimals = x - Math.floor(x);

var decimalPlaces = x.toString().split('.')[1].length;
decimals = decimals.toFixed(decimalPlaces);

console.log(decimals); //Returns 0.2
11
Ethan

これを行う方法は次のとおりです。これが最も簡単な方法だと思います。

var x = 3.2;
int_part = Math.trunc(x); // returns 3
float_part = Number((x-int_part).toFixed(2)); // return 0.2
11
Zantafio

以下は、小数点区切り文字の地域設定に関係なく機能します。区切り文字に使用される文字は1文字のみです。

var n = 2015.15;
var integer = Math.floor(n).toString();
var strungNumber = n.toString();
if (integer.length === strungNumber.length)
  return "0";
return strungNumber.substring(integer.length + 1);

それはきれいではありませんが、それは正確です。

5
cdmdotnet

言語に依存しない方法:

var a = 3.2;
var fract = a * 10 % 10 /10; //0.2
var integr = a - fract; //3

1つのフラクタルな長さの数字に対してのみ修正されることに注意してください)

4
Nurlan

あなたはそれを文字列に変換し、replaceメソッドを使って整数部分をゼロに置き換えることができ、そして結果を数値に変換します:

var number = 123.123812,
    decimals = +number.toString().replace(/^[^\.]+/,'0');
4
gion_13

使用方法によっては後で指定しますが、この簡単な解決策も役に立ちます。

私はその良い解決策を言っていないが、いくつかの具体的なケースではうまくいく

var a = 10.2
var c = a.toString().split(".")
console.log(c[1] == 2) //True
console.log(c[1] === 2)  //False

しかし、それは@Brian M. Huntによる提案された解決策よりも時間がかかります。

(2.3 % 1).toFixed(4)
4
David Sánchez

精度が重要で、一貫した結果が必要な場合は、先頭の "0"を含め、任意の数値の小数部を文字列として返すことになるいくつかの命題があります。フロートとして使う必要がある場合は、最後にvar f = parseFloat( result )を追加するだけです。

小数部がゼロの場合、 "0.0"が返されます。 NULL、NaN、および未定義の数はテストされません。

1. String.split

var nstring = (n + ""),
    narray  = nstring.split("."),
    result  = "0." + ( narray.length > 1 ? narray[1] : "0" );

2. String.substring、String.indexOf

var nstring = (n + ""),
    nindex  = nstring.indexOf("."),
    result  = "0." + (nindex > -1 ? nstring.substring(nindex + 1) : "0");

3. Math.floor、Number.toFixed、String.indexOf

var nstring = (n + ""),
    nindex  = nstring.indexOf("."),
    result  = ( nindex > -1 ? (n - Math.floor(n)).toFixed(nstring.length - nindex - 1) : "0.0");

4. Math.floor、Number.toFixed、String.split

var nstring = (n + ""),
    narray  = nstring.split("."),
    result  = (narray.length > 1 ? (n - Math.floor(n)).toFixed(narray[1].length) : "0.0");

これがjsPerfのリンクです。 https://jsperf.com/decpart-of-number/

命題2が最速であることがわかります。

3

整数部分を取得するのにparseInt()関数を使用することができます小数部分を抽出するのにそれを使用すること

var myNumber = 3.2;
var integerPart = parseInt(myNumber);
var decimalPart = myNumber - integerPart;
2
Sheki

問題のすべての数が1つの10進数だけを持ち、10進数の部分を整数として取得したいと思っていたので、このようなアプローチを使用することになりました。

var number = 3.1,
    decimalAsInt = Math.round((number - parseInt(number)) * 10); // returns 1

これは整数に対してもうまく働き、そのような場合には0を返します。

1
walpek

使ってます:

var n = -556.123444444;
var str = n.toString();
var decimalOnly = 0;

if( str.indexOf('.') != -1 ){ //check if has decimal
    var decimalOnly = parseFloat(Math.abs(n).toString().split('.')[1]);
}

入力:-556.123444444

結果:123444444

1
DavidDunham

これに答えるのは非常に遅れていますが、コードを見てください。

let floatValue = 3.267848;
let decimalDigits = floatValue.toString().split('.')[1];
let decimalPlaces = decimalDigits.length;
let decimalDivider = Math.pow(10, decimalPlaces);
let fractionValue = decimalDigits/decimalDivider;
let integerValue = floatValue - fractionValue;

console.log("Float value: "+floatValue);
console.log("Integer value: "+integerValue);
console.log("Fraction value: "+fractionValue)
0
Hifzur Rahman

これらのいくつかを見た後、私は今使っています...

var rtnValue = Number(7.23);
var tempDec = ((rtnValue / 1) - Math.floor(rtnValue)).toFixed(2);
0
Patrick
n = Math.floor(x);
remainder = x % 1;
0
masterxilo

数学関数は高速ですが、常にネイティブの期待値を返しません。私が見つけた最も簡単な方法は

(3.2+'').replace(/^[-\d]+\./, '')
0
Vasilii Suricov