У меня есть числа с плавающей точкой, как 3.2
и 1.6
.
Мне нужно разделить число на целое и десятичное число. Например, значение 3.2
будет разделено на два числа, то есть 3
и0.2
Получить целую часть легко:
n = Math.floor(n);
Но у меня проблемы с получением десятичной части. Я пробовал это:
remainer = n % 2; //obtem a parte decimal do rating
Но это не всегда работает правильно.
Предыдущий код имеет следующий вывод:
n = 3.1 => remainer = 1.1
Что мне здесь не хватает?
n = Math.floor(n);
возвращается только желаемый результат (целочисленная часть) для неотрицательных чисел% 1
не использовать% 2
Ответы:
Используйте
1
, нет2
.источник
Math.*
или%
операций.toFixed
может помочь в некоторых ситуациях, например(2.3 % 1).toFixed(4)
=="0.3000"
.(2.3 % 1).toFixed(4).substring(2)
="3000"
если вам это нужно без0.
2.3
возникло, а не2
или3
, число0.2999999999999998
вполне приемлемо, несмотря на то, как оскорбительно оно выглядит для человеческих глаз.Хотя это не будет работать для минус числа, поэтому нам, возможно, придется сделать
источник
Math.floor()
повторно звонить - просто используйте целочисленную часть, которую вы рассчитали.var n = 3.2, integr = Math.floor(n), decimal = n - integr;
используйте Math.floor () только один раз.integr = 3; decimal = 0.20000000000000018;
Math.floor
сMath.trunc
.Вы могли бы преобразовать в строку, верно?
источник
n.toString()
вместо,n + ""
потому что это более читабельно.n + ""
действительно лучше (см. Jsperf.com/number-vs-number-tostring-vs-string-number ).
в качестве десятичного разделителя, поэтому у вас все будет хорошо, если тип входной переменной float. Вы должны иметь дело с этой проблемой, только если ваш ввод - строка. Я также должен отметить, что этот ответ возвращает строку в массиве. Более полное решениеparseFloat('0.' + (n + '').split('.')[1])
Как 0.2999999999999998 является приемлемым ответом? Если бы я был спрашивающим, я бы хотел получить ответ .3. Здесь мы имеем ложную точность, и мои эксперименты с floor,% и т. Д. Показывают, что Javascript любит ложную точность для этих операций. Поэтому я думаю, что ответы, использующие преобразование в строку, находятся на правильном пути.
Я бы сделал это:
В частности, я использовал 100233.1 и хотел получить ответ «.1».
источник
.toString()
не считает i18n. Десятичный разделитель всегда будет в.
соответствии с MDN и спецификацией ECMAВот как я это делаю, и я думаю, что это самый простой способ сделать это:
источник
Простой способ сделать это:
К сожалению, это не возвращает точное значение. Однако это легко исправить:
Вы можете использовать это, если вы не знаете количество знаков после запятой:
источник
Независимый от языка способ:
обратите внимание, что это верно только для чисел с одной длиной фракции)
источник
var factor = Math.pow(10, desiredFractionLength); var fract = a * factor % factor / factor;
Вы можете использовать
parseInt()
функцию, чтобы получить целую часть, чем использовать это, чтобы извлечь десятичную частьИли вы можете использовать регулярные выражения, такие как:
источник
0.20000000000000018
... это действительно становится трудно сделать, потому что0.2 < 0.20000000000000018
возвращает true .. 3.2 должно возвращать 0.2: P с таким количеством нарушений и использованием.toFixed(2)
возвращаемой строки: PСледующее работает независимо от региональных настроек десятичного разделителя ... при условии, что для разделителя используется только один символ.
Это не красиво, но это точно.
источник
Если точность имеет значение и вам требуются непротиворечивые результаты, вот несколько предложений, которые будут возвращать десятичную часть любого числа в виде строки, включая начальный «0». Если вам это нужно как поплавок, просто добавьте
var f = parseFloat( result )
в конце.Если десятичная часть равна нулю, будет возвращено «0.0». Ноль, NaN и неопределенные числа не проверяются.
1. String.split
2. String.substring, String.indexOf
3. Math.floor, Number.toFixed, String.indexOf
4. Math.floor, Number.toFixed, String.split
Вот ссылка на jsPerf: https://jsperf.com/decpart-of-number/
Мы видим, что предложение № 2 является самым быстрым.
источник
Вы можете преобразовать его в строку и использовать
replace
метод для замены целочисленной части на ноль, а затем преобразовать результат обратно в число:источник
/^[^,]/
), но вы должны оставить результат в виде строки (удалить+
оператор), чтобы избежатьNaN
результатов.В зависимости от использования вы дадите потом, но это простое решение также может помочь вам.
Я не говорю, что это хорошее решение, но для некоторых конкретных случаев работает
Но это займет больше времени, чем предложенное решение @Brian M. Hunt
источник
У меня был случай, когда я знал, что у всех рассматриваемых чисел будет только один десятичный знак, и хотел получить десятичную дробь как целое число, поэтому я в итоге использовал такой подход:
Это хорошо работает и с целыми числами, возвращая 0 в этих случаях.
источник
Я использую:
Ввод: -556.123444444
Результат: 123444444
источник
Математические функции работают быстрее, но всегда возвращают ненативные ожидаемые значения. Самый простой способ, который я нашел, это
источник
Хороший вариант - преобразовать число в строку, а затем разбить ее.
В одной строке кода
источник
Посмотрев на некоторые из них, я теперь использую ...
источник
источник
Хотя я очень поздно отвечаю на этот вопрос, пожалуйста, посмотрите код.
источник
Десятичный знак и формат числа с плавающей точкой могут зависеть от country (
.,
), поэтому независимое решение, которое сохранило часть с плавающей точкой:- это интернационализированное решение, а не зависящее от местоположения:
Описание решения шаг за шагом:
parseFloat()
для гарантии входного сигналаMath.abs()
во избежание проблем с отрицательными числамиn = parseInt(x)
для получения десятичной частиx - n
для вычитания десятичной частиtoFixed()
с количеством цифр в плавающей части исходного числа с плавающей точкойx
. Количество рассчитывается как разница между длиной исходного числаx
и числаn
в их строковом представлении.источник
Используйте это:
Math.frac
Функция здесь имеет 3 режима работы :Это просто :)
источник
источник