3.2
や1.6
のような浮動小数点数があります。
数字を整数部分と小数部分に分ける必要があります。たとえば、3.2
の値は2つの数字、つまり3
と0.2
に分割されます。
整数部分を取得するのは簡単です。
n = Math.floor(n);
しかし、私は小数部分を取得するのに苦労しています。私はこれを試しました:
remainer = n % 2; //obtem a parte decimal do rating
しかし、それは常に正しく機能するわけではありません。
前のコードの出力は以下のとおりです。
n = 3.1 => remainer = 1.1
ここで何が足りないの?
1
ではなく2
を使用してください。
js> 2.3 % 1
0.2999999999999998
var decimal = n - Math.floor(n)
これはマイナスの数値ではうまくいきませんが、しなければならない可能性があります。
n = Math.abs(n); // Change to positive
var decimal = n - Math.floor(n)
あなたは文字列に変換できますよね?
n = (n + "").split(".");
0.2999999999999998はどのように受け入れられますか。私が質問者であれば、私は0.3の答えが欲しいでしょう。私たちがここで持っているのは誤った精度です、そして私のfloor、%などの実験はJavascriptがこれらの操作のための誤った精度を好むことを示しています。だから私は文字列への変換を使用している答えは正しい軌道に乗っていると思います。
私はこれをするだろう:
var decPart = (n+"").split(".")[1];
具体的には、100233.1を使用していましたが、答えは「.1」でした。
簡単な方法は次のとおりです。
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
これを行う方法は次のとおりです。これが最も簡単な方法だと思います。
var x = 3.2;
int_part = Math.trunc(x); // returns 3
float_part = Number((x-int_part).toFixed(2)); // return 0.2
以下は、小数点区切り文字の地域設定に関係なく機能します。区切り文字に使用される文字は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);
それはきれいではありませんが、それは正確です。
言語に依存しない方法:
var a = 3.2;
var fract = a * 10 % 10 /10; //0.2
var integr = a - fract; //3
1つのフラクタルな長さの数字に対してのみ修正されることに注意してください)
あなたはそれを文字列に変換し、replace
メソッドを使って整数部分をゼロに置き換えることができ、そして結果を数値に変換します:
var number = 123.123812,
decimals = +number.toString().replace(/^[^\.]+/,'0');
使用方法によっては後で指定しますが、この簡単な解決策も役に立ちます。
私はその良い解決策を言っていないが、いくつかの具体的なケースではうまくいく
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)
精度が重要で、一貫した結果が必要な場合は、先頭の "0"を含め、任意の数値の小数部を文字列として返すことになるいくつかの命題があります。フロートとして使う必要がある場合は、最後にvar f = parseFloat( result )
を追加するだけです。
小数部がゼロの場合、 "0.0"が返されます。 NULL、NaN、および未定義の数はテストされません。
var nstring = (n + ""),
narray = nstring.split("."),
result = "0." + ( narray.length > 1 ? narray[1] : "0" );
var nstring = (n + ""),
nindex = nstring.indexOf("."),
result = "0." + (nindex > -1 ? nstring.substring(nindex + 1) : "0");
var nstring = (n + ""),
nindex = nstring.indexOf("."),
result = ( nindex > -1 ? (n - Math.floor(n)).toFixed(nstring.length - nindex - 1) : "0.0");
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が最速であることがわかります。
整数部分を取得するのにparseInt()
関数を使用することができます小数部分を抽出するのにそれを使用すること
var myNumber = 3.2;
var integerPart = parseInt(myNumber);
var decimalPart = myNumber - integerPart;
問題のすべての数が1つの10進数だけを持ち、10進数の部分を整数として取得したいと思っていたので、このようなアプローチを使用することになりました。
var number = 3.1,
decimalAsInt = Math.round((number - parseInt(number)) * 10); // returns 1
これは整数に対してもうまく働き、そのような場合には0を返します。
使ってます:
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
これに答えるのは非常に遅れていますが、コードを見てください。
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)
これらのいくつかを見た後、私は今使っています...
var rtnValue = Number(7.23);
var tempDec = ((rtnValue / 1) - Math.floor(rtnValue)).toFixed(2);
n = Math.floor(x);
remainder = x % 1;
数学関数は高速ですが、常にネイティブの期待値を返しません。私が見つけた最も簡単な方法は
(3.2+'').replace(/^[-\d]+\./, '')