JavaScriptを使用して数値の小数部分を取得する


247

とのような浮動小数点数が3.2あり1.6ます。

数値を整数部と小数部に分ける必要があります。例えば、の値は3.2二つの数に分割されるだろう、すなわち30.2

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

n = Math.floor(n);

しかし、小数部分を取得するのに問題があります。私はこれを試しました:

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

ただし、常に正しく機能するとは限りません。

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

n = 3.1 => remainer = 1.1

ここで何が欠けていますか?


1
n = Math.floor(n);非負の数値に対して希望する結果(整数部分)のみを返すことに注意してください
tsemer

使用し% 1ないでください% 2
masterxilo 2018年

回答:


367

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

js> 2.3 % 1
0.2999999999999998

59
0.2999999999999998が0.3に等しい世界では、これは許容される場合があります。私にとってはそうではありません...したがって、この課題を解決するために、Math.*またはの%操作を控えます。
MarcelStör14年

62
上記の浮動小数点の丸めの問題を回避するために、==などのtoFixed状況で使用すると役立つ場合があります。(2.3 % 1).toFixed(4)"0.3000"
ブライアンM.ハント

12
(2.3 % 1).toFixed(4).substring(2)= "3000"なしで必要な場合0.
Simon_Weaver

14
2.3が発生した、2またはが発生していない世界では3、その数0.2999999999999998は人間の目にはどのように侮辱されても、まったく問題ありません。
Gershom 2017

1
@GershomMaesその数が受け入れられないさまざまな状況があります。
Adam Leggett

92
var decimal = n - Math.floor(n)

これはマイナス数では機能しないので、

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

すでに整数部分がある場合は、Math.floor()再度呼び出す必要はありません。計算した整数部分を使用してください。
tvanfosson 2010

4
var n = 3.2, integr = Math.floor(n), decimal = n - integr;Math.floor()を一度だけ使用します。 integr = 3; decimal = 0.20000000000000018;
Nurlan 2016年

2
負の数を処理するには、単にと交換Math.floorMath.truncます。
Igor Silva

これは、0.79999ではなく100.80から0.80を取得すると予想したような正確でない数値を返していました... decimal.toFixed(2)を追加してこれを解決しました
Luis Febro

76

文字列に変換できますよね?

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

17
これは、コンマが小数点記号であるヨーロッパ大陸を除くすべての場所でうまく機能します。これを使用する予定がある場合は、多国籍でヨーロッパをターゲットにしている場合は、このことを考慮に入れてください。これは、このソリューションではうまく機能しないためです。
cdmdotnet 2015年

8
私はヨーロッパ大陸出身で、フランス語版のFirefoxを使用しています。通常、フランスでは小数点としてカンマを使用します。その理由は、私が使用して好むだろうが、JavaScriptで数値を文字列に変換する際に関係する一切の文化が存在しないということでn.toString()はなく、n + ""それが読みやすくなるため。
Gabriel Hautclocq 2017

2
速度が重要である場合、それn + ""は確かに優れています(jsperf.com/number-vs-number-tostring-vs-string-numberを参照)
Gabriel Hautclocq 2017

@cdmdotnet JSは.小数点記号として使用するため、入力変数の型が浮動小数点であればどこでも問題ありません。入力が文字列の場合にのみ、この問題に対処する必要があります。また、この回答では文字列が配列で返されることにも注意してください。より完全なソリューションはparseFloat('0.' + (n + '').split('.')[1])
totymedli

@cdmdotnetの場所に依存しないソリューションはここにある:stackoverflow.com/a/59469716/1742529
user1742529

32

0.2999999999999998はどのように受け入れられますか?私が質問者だった場合、0.3の回答が必要です。ここにあるのは誤った精度であり、floor、%などを使った私の実験は、JavaScriptがこれらの演算に対して誤った精度を好むことを示しています。したがって、文字列への変換を使用している答えは正しい方向に進んでいると思います。

私はこれを行います:

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

具体的には、100233.1を使用していて、「。1」という答えが必要でした。


6
私は概ね同意しますが、「。」に依存することはできません。小数点としての正規表現はi18n文字です。
MarcelStör2014

1
@jomofrodo実際、丸められていない値が必要な場合があります。OPが丸められた値を要求するのを思い出せず、値を分割するだけです。
VVV 2014年

1
@VVVはい、丸められていない値が必要な場合があります。ただし、小数点以下9桁までの精度が必要な場合でも、入力データが実際にそれをサポートしているとは限りません。これが「偽精度」と呼ばれる理由です。入力が3.1の場合、答えの精度は10分の1、つまり1になります。.09と答えた場合、実際には元の入力が10分の1の精度しかなかったのに、100分の1の精度まで実際に計算/測定したことを意味します。
jomofrodo 2014年

1
簡単に処理できる@MarcelStör:var decPart =(n.toLocaleString( "en"))。split( "。")[1];
JEM

1
.toString()i18nを考慮しません。小数点記号は常に. MDNおよびECMA仕様に
準拠します

18

ここに私がそれをする方法があります、私はそれをする最も簡単な方法だと思います:

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

15

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

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


9

言語に依存しない方法:

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

1つの分数長さを持つ数値のみを修正することに注意してください)


3
これが言語に依存しないと思う理由を説明できますか?JavaScriptです。
hotzst

4
@hotzst、言語固有の機能はありません
Nurlan

1
純粋な数学なので、言語に依存しません。実用的なソリューション。希望する小数部の長さ:var factor = Math.pow(10, desiredFractionLength); var fract = a * factor % factor / factor;
muratgozel

6

あなたparseInt()は小数部を抽出するためにそれを使用するよりも、整数部を取得するために関数を使用することができます

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

または、次のような正規表現を使用できます。

splitFloat = function(n){
   const regex = /(\d*)[.,]{1}(\d*)/;
   var m;

   if ((m = regex.exec(n.toString())) !== null) {
       return {
          integer:parseInt(m[1]),
          decimal:parseFloat(`0.${m[2]}`)
       }
   }
}

decimalPartが来てい0.20000000000000018ます... 0.2 < 0.20000000000000018trueを返すため、これは本当に難しくなっています。3.2は0.2を返すはずです:P非常に多くの不規則性を作り、.toFixed(2)文字列を返します:P
Himanshu Bansal

だ@HimanshuBansal JavaScriptの問題(のhier A stackeoverflow質問と)。私が提案した2番目の方法を使用できます。
シェキ

さて、私は少し異なる問題ステートメントを持っています...ちょっとそれはそれを解決するためにurの方法:Pの両方を使用しました.. ^^
Himanshu Bansal '22

@HimanshuBansal私の投稿があなたの問題の解決に役立ったことをうれしく思います!
シェキ

5

以下は、小数点記号の地域設定に関係なく機能します...区切り文字として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);

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


これはもちろん文字列なので、数値として使用する場合は、最初にparseInt()を使用する必要があります。parseFloat()を使用する必要はないはずです。ベース10の数値ではなく、ベース8の数値でここに欠けているものがない限り...私は何年も前から漠然と覚えています
cdmdotnet

5

精度が重要で、一貫した結果が必要な場合は、先頭の「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が最速であることがわかります。


これらは使用しないでください。レンダリング数がエンジニアリングに切り替わるとすぐに壊れます。また、ロケールに依存しません。
Spongman

「レンダリングのエンジニアリングへの切り替え数」について説明していただけますか?また、ローカリゼーションは関係ありません。数値を表すローカライズされた文字列ではなく、数値の小数部分だけが必要だからです。
Gabriel Hautclocq

4

それを文字列に変換し、replaceメソッドを使用して整数部分をゼロに置き換え、結果を数値に戻すことができます。

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

このソリューションは、コンマが小数点記号である大陸ヨーロッパでは機能しませんか?
プレストン2015

@preston正規表現のドットを他の好きな区切り文字(など/^[^,]/)に置き換えることができますが、結果+を回避するには、結果を文字列のままにする(演算子を削除する)必要がありNaNます。
gion_13 2015

4

後で使用する方法によって異なりますが、この簡単な解決策も役立ちます。

私はそれが良い解決策であるとは言いませんが、いくつかの具体的なケースではうまくいきます

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)

1
これは、コンマが小数点記号であるヨーロッパ大陸を除くすべての場所でうまく機能します。これを使用する予定がある場合は、多国籍でヨーロッパをターゲットにしている場合は、このことを考慮に入れてください。これは、このソリューションではうまく機能しないためです。
cdmdotnet 2015年

1

問題の数値がすべて10進数で1つしかないことを知っていて、小数部分を整数として取得したいというケースがありました。

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

これは整数でもうまく機能し、その場合は0を返します。


1

使ってます:

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

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

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

1

適切なオプションは、数値を文字列に変換してから分割することです。

// Decimal number
let number = 3.2;

// Convert it into a string
let string = number.toString();

// Split the dot
let array = string.split('.');

// Get both numbers
// The '+' sign transforms the string into a number again
let firstNumber  = +array[0]; // 3
let secondNumber = +array[1]; // 2

1行のコード

let [firstNumber, secondNumber] = [+number.toString().split('.')[0], +number.toString().split('.')[1]];

0

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

var rtnValue = Number(7.23);
var tempDec = ((rtnValue / 1) - Math.floor(rtnValue)).toFixed(2);


0

これに答えるのはとても遅いですが、コードを見てください。

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

浮動小数点小数点記号と数値形式は国(.,)に依存する可能性があるため、浮動小数点部分を保持する独立したソリューションは次のとおりです。

getFloatDecimalPortion = function(x) {
    x = Math.abs(parseFloat(x));
    let n = parseInt(x);
    return Number((x - n).toFixed(Math.abs((""+x).length - (""+n).length - 1)));
}

–場所に依存するのではなく、国際化されたソリューションです。

getFloatDecimalPortion = x => parseFloat("0." + ((x + "").split(".")[1]));

ステップごとのソリューションの説明:

  1. parseFloat() 入力訂正を保証するため
  2. Math.abs() 負の数の問題を回避するため
  3. n = parseInt(x) 小数部を取得するため
  4. x - n 小数部を引くため
  5. これで、小数部がゼロの数値が得られましたが、JavaScriptによって追加の浮動部分の桁が得られる可能性がありますが、これは望ましくありません。
  6. したがって、toFixed()元の浮動小数点数の浮動部分の桁数で呼び出して、追加の桁を制限しますx。カウントは、元の数値xn文字列表現の数値の長さの差として計算されます。

-1

これを使用してください:

function isNatural(n) {
    n = +n
    if (isNaN(n)) return 'NaN';
    return (n >= 0.0) && (Math.floor(n) === n) && n !== Infinity;
  }

Math.frac = function frac(x, m) {
    x = +x
    if (isNaN(x)) return NaN;
    if (isNatural(x) === true) return 0;
    m = +m || 1

      if (isNatural(x) === false && m === 1){
        var a = x.toString()
        var b = a.split('.')[1]
        var c = '0.' + b
        var d = +c
        return d;
      }

      if (isNatural(x) === false && m === 2){
        var a = x.toString()
        var b = a.split('.')[1]
        var c = +b
        return c;
      }

      if (isNatural(x) === false && m === 3){
        var a = x.toString()
        var b = a.split('.')[1]
        var c = '0.' + b
        var d = +c * 100
        return d;
      }    
  }

このMath.frac関数には3つのモードがあります。

Math.frac(11.635) //0.635
Math.frac(11.635, 1) //0.635 - default mode is 1
Math.frac(11.635, 2) //635
Math.frac(11.635, 3) //63,5 (%)

それは簡単です :)


-9
float a=3.2;
int b=(int)a; // you'll get output b=3 here;
int c=(int)a-b; // you'll get c=.2 value here

4
それは私にはJavaScriptのようには見えません!
Ch'marr 2013

1
これはJavaスクリプトではありません
Amrut

JSでは、次のようになります。vara = 3.2; var b = parseInt(a、10); var c = a-b;
Ju-v
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.