У меня есть число с плавающей запятой:
var f = 0.1457;
Или:
var f = 4.7005
Как получить только остаток дроби как целое?
т.е. в первом примере я хочу получить:
var remainder = 1457;
Во втором примере:
var remainder = 7005;
У меня есть число с плавающей запятой:
var f = 0.1457;
Или:
var f = 4.7005
Как получить только остаток дроби как целое?
т.е. в первом примере я хочу получить:
var remainder = 1457;
Во втором примере:
var remainder = 7005;
Это сделает это (до 4 цифр, которые вы хотите, измените мультипликатор (10000) на больший или меньший, если вы хотите меньшее или большее число):
Math.ceil(((f < 1.0) ? f : (f % Math.floor(f))) * 10000)
function frac(f) {
return f % 1;
}
надеюсь, что помогает; -)
В то время как это не то, что большинство людей захочет, но TS попросил, чтобы фракция была целой, вот она:
function fract(n){ return Number(String(n).split('.')[1] || 0); }
fract(1.23) // = 23
fract(123) // = 0
fract(0.0008) // = 8
Вы можете вычесть пол номера, давая вам только дробную часть, а затем умножьте на 10000, т.е.:
var remainder = (f-Math.floor(f))*10000;
parseInt(parseFloat(amount).toString().split('.')[1], 10)
Это также зависит от того, что вы хотите сделать с остатком (как уже спрашивали комментаторы). Например, если базовое число равно 1.03, вы хотите, чтобы возвращаемый остаток был 3 или 03 - я имею в виду, вы хотите его как число или как строку (для отображения ее пользователю). Одним из примеров может служить просмотр цены на товары, где вы не хотите конвертировать 03 в 3 (например, $1,03), где вы хотите добавить индекс выше.
Далее, проблема заключается в точности float. Рассмотрим это:
var price = 1.03;
var frac = (price - Math.floor(price))*100;
// frac = 3.0000000000000027
Таким образом, вы можете "решить" это, разрезав представление строк без умножения (и необязательного нулевого заполнения) в таких случаях. В то же время вы избегаете проблемы с плавающей точностью. Также показано в этот jsfiddle.
var strNumber = f.toString();
var remainder = strNumber.substr(strNumber.indexOf('.') + 1, 4);
remainder = Number(reminder);
Я бы сказал, что, предполагая, что мы хотим отображать эти значения для пользователя, обработка этих чисел как строк будет лучшим подходом. Это оборачивается вопросом дробных значений, таких как 0,002.
Я столкнулся с этой проблемой при попытке отобразить цены с центами в верхнем индексе.
let price = 23.43; // 23.43
let strPrice = price.toFixed(2) + ''; // "23.43"
let integer = strPrice.split(".")[0] // "23"
let fractional = strPrice.split(".")[1] // "43"