我有像3.2和1.6这样的浮点数。
我需要把这个数分成整数部分和小数部分。例如,3.2的值将被分成两个数字,即3和0.2
获取整数部分很简单:
n = Math.floor(n);
但是我在计算小数部分时遇到了麻烦。 我试过了:
remainder = n % 2; //obtem a parte decimal do rating
但它并不总是正确工作。
前面的代码有以下输出:
n = 3.1 // gives remainder = 1.1
我错过了什么?
我有像3.2和1.6这样的浮点数。
我需要把这个数分成整数部分和小数部分。例如,3.2的值将被分成两个数字,即3和0.2
获取整数部分很简单:
n = Math.floor(n);
但是我在计算小数部分时遇到了麻烦。 我试过了:
remainder = n % 2; //obtem a parte decimal do rating
但它并不总是正确工作。
前面的代码有以下输出:
n = 3.1 // gives remainder = 1.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
其他回答
以下是我的做法,我认为这是最直接的方法:
var x = 3.2;
int_part = Math.trunc(x); // returns 3
float_part = Number((x-int_part).toFixed(2)); // return 0.2
这取决于你以后的用法,但这个简单的解决方案也可以帮助你。
我不是说这是一个很好的解决方案,但在一些具体的情况下是可行的
var a = 10.2
var c = a.toString().split(".")
console.log(c[1] == 2) //True
console.log(c[1] === 2) //False
但这比布莱恩·m·亨特提出的解决方案需要更长的时间
(2.3 % 1).toFixed(4)
数学函数更快,但总是返回不是本机的期望值。 我发现最简单的方法就是
(3.2+'').replace(/^[-\d]+\./, '')
为什么0.2999999999999998是一个可以接受的答案?如果我是提问者,我希望答案是。3。我们在这里得到的是错误的精度,我对floor、%等的实验表明,Javascript对这些操作喜欢错误的精度。所以我认为使用字符串转换的答案是正确的。
我会这样做:
var decPart = (n+"").split(".")[1];
具体来说,我使用100233.1,我想要答案“.1”。
2021年更新
优化版本处理精度(或不)。
// Global variables. const DEFAULT_PRECISION = 16; const MAX_CACHED_PRECISION = 20; // Helper function to avoid numerical imprecision from Math.pow(10, x). const _pow10 = p => parseFloat(`1e+${p}`); // Cache precision coefficients, up to a precision of 20 decimal digits. const PRECISION_COEFS = new Array(MAX_CACHED_PRECISION); for (let i = 0; i !== MAX_CACHED_PRECISION; ++i) { PRECISION_COEFS[i] = _pow10(i); } // Function to get a power of 10 coefficient, // optimized for both speed and precision. const pow10 = p => PRECISION_COEFS[p] || _pow10(p); // Function to trunc a positive number, optimized for speed. // See: https://stackoverflow.com/questions/38702724/math-floor-vs-math-trunc-javascript const trunc = v => (v < 1e8 && ~~v) || Math.trunc(v); // Helper function to get the decimal part when the number is positive, // optimized for speed. // Note: caching 1 / c or 1e-precision still leads to numerical errors. // So we have to pay the price of the division by c. const _getDecimals = (v = 0, precision = DEFAULT_PRECISION) => { const c = pow10(precision); // Get precision coef. const i = trunc(v); // Get integer. const d = v - i; // Get decimal. return Math.round(d * c) / c; } // Augmenting Number proto. Number.prototype.getDecimals = function(precision) { return (isFinite(this) && (precision ? ( (this < 0 && -_getDecimals(-this, precision)) || _getDecimals(this, precision) ) : this % 1)) || 0; } // Independent function. const getDecimals = (input, precision) => (isFinite(input) && ( precision ? ( (this < 0 && -_getDecimals(-this, precision)) || _getDecimals(this, precision) ) : this % 1 )) || 0; // Tests: const test = (value, precision) => ( console.log(value, '|', precision, '-->', value.getDecimals(precision)) ); test(1.001 % 1); // --> 0.0009999999999998899 test(1.001 % 1, 16); // --> 0.000999999999999 test(1.001 % 1, 15); // --> 0.001 test(1.001 % 1, 3); // --> 0.001 test(1.001 % 1, 2); // --> 0 test(-1.001 % 1, 16); // --> -0.000999999999999 test(-1.001 % 1, 15); // --> -0.001 test(-1.001 % 1, 3); // --> -0.001 test(-1.001 % 1, 2); // --> 0