使用 JavaScript 获取数字的小数部分
我有像 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
我在这里缺少什么?
I have float numbers like 3.2
and 1.6
.
I need to separate the number into the integer and decimal part. For example, a value of 3.2
would be split into two numbers, i.e. 3
and 0.2
Getting the integer portion is easy:
n = Math.floor(n);
But I am having trouble getting the decimal portion.
I have tried this:
remainder = n % 2; //obtem a parte decimal do rating
But it does not always work correctly.
The previous code has the following output:
n = 3.1 // gives remainder = 1.1
What I am missing here?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(30)
使用
1
,而不是2
。Use
1
, not2
.虽然这不适用于负数,所以我们可能不得不这样做
Although this won't work for minus numbers so we might have to do
你可以转换成字符串,对吗?
You could convert to string, right?
0.2999999999999998 如何是可接受的答案?如果我是提问者,我会想要 0.3 的答案。我们这里有的是假精度,我对下限、% 等的实验表明 Javascript 喜欢这些操作的假精度。所以我认为使用转换为字符串的答案是正确的。
我会这样做:
具体来说,我使用的是 100233.1,我想要答案“.1”。
How is 0.2999999999999998 an acceptable answer? If I were the asker I would want an answer of .3. What we have here is false precision, and my experiments with floor, %, etc indicate that Javascript is fond of false precision for these operations. So I think the answers that are using conversion to string are on the right track.
I would do this:
Specifically, I was using 100233.1 and I wanted the answer ".1".
这是我的做法,我认为这是最直接的方法:
Here's how I do it, which I think is the most straightforward way to do it:
一个简单的方法是:
不幸的是,这不会返回确切的值。然而,这很容易解决:
如果您不知道小数位数,可以使用它:
A simple way of doing it is:
Unfortunately, that doesn't return the exact value. However, that is easily fixed:
You can use this if you don't know the number of decimal places:
不依赖任何标准 JS 函数:
请注意,它仅对于具有一位小数点的数字是正确的。
Without relying on any standard JS functions:
Note that it is correct only for numbers with one decimal point.
您可以使用 parseInt() 函数来获取整数部分,而不是使用它来提取小数部分
或者您可以使用正则表达式,例如:
You can use
parseInt()
function to get the integer part than use that to extract the decimal partOr you could use regex like:
如果精度很重要并且您需要一致的结果,这里有一些命题,它们会将任何数字的小数部分作为字符串返回,包括前导“0.”。如果您需要将其作为浮点数,只需在末尾添加 var f = parseFloat( result ) 即可。
如果小数部分为零,则返回“0.0”。未测试 Null、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是最快。
If precision matters and you require consistent results, here are a few propositions that will return the decimal part of any number as a string, including the leading "0.". If you need it as a float, just add
var f = parseFloat( result )
in the end.If the decimal part equals zero, "0.0" will be returned. Null, NaN and undefined numbers are not tested.
1. String.split
2. String.substring, String.indexOf
3. Math.floor, Number.toFixed, String.indexOf
4. Math.floor, Number.toFixed, String.split
Here is a jsPerf link: https://jsperf.com/decpart-of-number/
We can see that proposition #2 is the fastest.
只需使用模 1 即可。
Just use modulo 1.
一个好的选择是将数字转换为字符串,然后将其拆分。
在一行代码中
A good option is to transform the number into a string and then split it.
In one line of code
无论小数点分隔符的区域设置如何,以下操作都有效...条件是仅使用一个字符作为分隔符。
它不漂亮,但很准确。
The following works regardless of the regional settings for decimal separator... on the condition only one character is used for a separator.
It ain't pretty, but it's accurate.
取决于您随后给出的用法,但这个简单的解决方案也可以帮助您。
我并不是说它是一个好的解决方案,但对于某些具体情况有效
,但它需要比 @Brian M. Hunt 提出的解决方案更长的时间
Depending the usage you will give afterwards, but this simple solution could also help you.
Im not saying its a good solution, but for some concrete cases works
But it will take longer than the proposed solution by @Brian M. Hunt
您可以简单地使用
parseInt()
函数来帮助,例如:You can simply use
parseInt()
function to help, example:解决方案
最简单的方法是使用 mod (
%
) 运算符:说明
mod 运算符给出算术除法的余数。
示例:
14 % 4
是 2,因为14 / 4
是 3,其余数是 2。那么,由于
n % 1< /code> 始终在 0 和 1 之间或
[0, 1)
它对应于n
的小数部分。Solution
The simplest way is to use the mod (
%
) operator:Explanation
The mod operator gives the remainder of the arithmetical division.
Example:
14 % 4
is 2 because14 / 4
is 3 and its remainder is 2.Then, since
n % 1
is always between 0 and 1 or[0, 1)
it corresponds to the decimal part ofn
.我正在使用:
输入:-556.123444444
结果:123444444
I am using:
Input: -556.123444444
Result: 123444444
您可以将其转换为字符串并使用
replace
方法将整数部分替换为零,然后将结果转换回数字:You could convert it to a string and use the
replace
method to replace the integer part with zero, then convert the result back to a number :数学函数速度更快,但始终返回的不是本机预期值。
我发现的最简单的方法是
Math functions are faster, but always returns not native expected values.
Easiest way that i found is
避免数学不精确的最佳方法是转换为字符串,但使用 toLocaleString 确保它采用您期望的“点”格式:
The best way to avoid mathematical imprecision is to convert to a string, but ensure that it is in the "dot" format you expect by using toLocaleString:
我遇到过一种情况,我知道所有相关数字都只有一位小数,并且希望将小数部分作为整数获取,因此我最终使用了这种方法:
这也适用于整数,在这些情况下返回 0。
I had a case where I knew all the numbers in question would have only one decimal and wanted to get the decimal portion as an integer so I ended up using this kind of approach:
This works nicely also with integers, returning 0 in those cases.
虽然我很晚才回答这个问题,但请看一下代码。
Although I am very late to answer this, please have a look at the code.
我喜欢这个答案https://stackoverflow.com/a/4512317/1818723只需要应用浮点修复
功能齐全处理消极和
积极如果您是加密货币交易平台开发人员或银行系统开发人员或任何 JS 开发人员;)请在任何地方应用 fpFix。谢谢!
I like this answer https://stackoverflow.com/a/4512317/1818723 just need to apply float point fix
Complete function handling negative and positive
P.S. If you are cryptocurrency trading platform developer or banking system developer or any JS developer ;) please apply fpFix everywhere. Thanks!
在看了其中的几个之后,我现在正在使用......
After looking at several of these, I am now using...
浮点小数符号和数字格式可能与国家相关(
.,
),因此保留浮点部分的独立解决方案是:它是国际化解决方案,而不是依赖于位置的:
– 逐步描述:
parseFloat()
用于保证输入正确Math.abs()
用于避免负数问题n = parseInt(x)
用于获取小数部分x - n
用于减去小数部分x
的浮动部分的位数。计数是根据字符串表示形式中原始数字x
和数字n
的长度之间的差异来计算的。Floating-point decimal sign and number format can be dependent from country (
.,
), so independent solution, which preserved floating point part, is:– it is internationalized solution, instead of location-dependent:
Solution desription step by step:
parseFloat()
for guaranteeing input cocrrectionMath.abs()
for avoiding problems with negative numbersn = parseInt(x)
for getting decimal partx - n
for substracting decimal parttoFixed()
with count of digits in floating part of original float numberx
. Count is calculated as difference between length of original numberx
and numbern
in their string representation.2021 更新
解决精度问题(或不解决精度问题)的优化版本。
2021 Update
Optimized version that tackles precision (or not).
该函数将浮点数拆分为整数并以数组形式返回:
您可以将其扩展为仅返回现有数字,如果不存在数字则返回 null:
This function splits float number into integers and returns it in array:
You can extend it to only return existing numbers and
null
if no number exists:您还可以截断数字
You can also truncate the number
以下函数将返回一个包含 2 个元素的数组。第一个元素将是整数部分,第二个元素将是小数部分。
The following function will return an array which will have 2 elements. The first element will be the integer part and the second element will be the decimal part.
例如两个数字相加
For example for add two numbers
还有另一种方式:
Yet another way: