使用 JavaScript 获取数字的小数部分

IT技术 javascript floating-point numbers decimal rounding
2021-01-21 12:15:01

我有像3.2这样的浮点数1.6

我需要将数字分成整数和小数部分。例如,一个值3.2将被分成两个数字,即30.2

获取整数部分很容易:

n = Math.floor(n);

但是我在获取小数部分时遇到问题。我试过这个:

remainder = n % 2; //obtem a parte decimal do rating

但它并不总是能正常工作。

前面的代码具有以下输出:

n = 3.1 // gives remainder = 1.1

我在这里缺少什么?

6个回答

使用1,不是2

js> 2.3 % 1
0.2999999999999998
(2.3 % 1).toFixed(4).substring(2)="3000"如果你不需要它0.
2021-03-19 12:15:01
为了避免提到的浮点舍入问题,toFixed在某些情况下使用可能会有所帮助,例如(2.3 % 1).toFixed(4)== "0.3000"
2021-03-26 12:15:01
在 0.2999999999999998 等于 0.3 的世界中,这可能是可以接受的。对我来说不是......因此,为了解决这个挑战,我会避免使用Math.*%操作。
2021-03-28 12:15:01
在当今世界,数字2.3出现了,而不是23,数量0.2999999999999998是多么不顾侮辱它看起来对人眼完全可以接受的。
2021-04-02 12:15:01
@GershomMaes 在多种情况下,该数字是不可接受的。
2021-04-11 12:15:01
var decimal = n - Math.floor(n)

虽然这对负数不起作用,所以我们可能不得不这样做

n = Math.abs(n); // Change to positive
var decimal = n - Math.floor(n)
如果您已经有了整数部分,则无需Math.floor()再次调用——只需使用您计算过的整数部分。
2021-03-17 12:15:01
为了使用负数,只需Math.floorMath.trunc.
2021-04-07 12:15:01
var n = 3.2, integr = Math.floor(n), decimal = n - integr;只使用一次Math.floor()integr = 3; decimal = 0.20000000000000018;
2021-04-09 12:15:01
这返回了一个不准确的数字,就像我希望从 100.80 得到 0.80,而不是 0.79999 一样......我通过添加 decimal.toFixed(2) 解决了这个问题
2021-04-12 12:15:01

你可以转换成字符串,对吧?

n = (n + "").split(".");
这适用于除欧洲大陆以外的任何地方,其中逗号 , 是小数点分隔符。如果您打算使用它,请记住,如果您是跨国公司并以欧洲为目标,请考虑到这一点,因为此解决方案对他们来说不会很好。
2021-03-19 12:15:01
@cdmdotnet JS.用作小数分隔符,因此如果您的输入变量的类型是浮点数,那么您在任何地方都可以。如果您的输入是字符串,您只需处理该问题。我还必须注意,这个答案返回一个数组中的字符串。一个更完整的解决方案是parseFloat('0.' + (n + '').split('.')[1])
2021-03-21 12:15:01
如果速度很重要,那么n + ""确实更好(参见jsperf.com/number-vs-number-tostring-vs-string-number
2021-03-26 12:15:01
我来自欧洲大陆,使用法国 Firefox,它工作正常。通常我们会在法国使用逗号作为小数点分隔符。原因是在 JavaScript 中,将数字转换为字符串时不涉及文化,尽管我更喜欢使用n.toString()而不是n + ""因为它更具可读性。
2021-03-28 12:15:01
@cdmdotnet 位置独立解决方案在这里:stackoverflow.com/a/59469716/1742529
2021-04-09 12:15:01

0.2999999999999998 如何是可接受的答案?如果我是提问者,我希望得到 0.3 的答案。我们这里有的是错误精度,我对 floor、% 等的实验表明 Javascript 喜欢这些操作的错误精度。所以我认为使用转换为字符串的答案是正确的。

我会这样做:

var decPart = (n+"").split(".")[1];

具体来说,我使用的是 100233.1,我想要答案“.1”。

@VVV 是的,有些人可能想要非四舍五入的值。但仅仅因为您可能需要 9 位小数的精度并不意味着您的输入数据实际上支持它。这就是为什么它被称为“假精度”。如果您的输入是 3.1,那么您的答案所能达到的最大精度是十分之一,即 0.1。如果您回答 0.09,则意味着您实际上已计算/测量到 100 分之一的精度,而实际上原始输入仅准确到 10 分之一的精度。
2021-03-17 12:15:01
.toString()不考虑 i18n。小数分隔符将始终. 根据 MDNECMA 规范
2021-03-28 12:15:01
我大体上同意,但你不能依赖 '.' 作为小数分隔符的正则表达式是一个 i18n 字符
2021-04-04 12:15:01
@jomofrodo 实际上,有些人可能想要非四舍五入的值。我不记得 OP 要求四舍五入的值,只是拆分值。
2021-04-11 12:15:01
@MarcelStör 可以轻松处理: var decPart = (n.toLocaleString("en")).split(".")[1];
2021-04-11 12:15:01

这是我的做法,我认为这是最直接的方法:

var x = 3.2;
int_part = Math.trunc(x); // returns 3
float_part = Number((x-int_part).toFixed(2)); // return 0.2