连接带小数的数字并转换回int的正确方法是什么?

时间:2016-12-12 21:53:43

标签: javascript

所以我正在分割显示器的宽度,这导致数字不那么干净。

我目前的解决方案是放弃右侧并将其用作填充以生成切片。

例如,如果我得到数字336.75(1366监视器减去滚动条除以4)

在将数字转换为字符串之后,我使用split方法将其拆分。

问题是我无法让右侧再次出现小数。

使用:

var testNumber = 336.75,
    numString  = testNumber.toString(),
    numParts   = numString.split('.'),
    numLeft    = numParts[0],
    numRight   = numParts[1];

如果我尝试将右侧桥接到这样的小数:

var newNum = parseInt('.'+numRight);

我得到了NaN的结果。

我希望获得0.75个数字并将其用作填充。

由于缺少小数点缺失,现在好像.75是数字75

parseFloat似乎有用

2 个答案:

答案 0 :(得分:2)

嗯,如果您使用parseFloat()(参见此jsFiddle),您尝试过的确实有效,但是有更好,更有效的方式来实现您的目标#&# 39;重新尝试做。

您可以通过向下舍入testNumber并从自身中减去填充值来轻松获得填充值。您可以使用Math.floor()为您完成大部分繁重工作:

var testNumber = 336.75,
    padding    = testNumber - Math.floor(testNumber); // padding == 0.75

获取号码的modulus也是可能的,但可能性较差:

var testNumber = 336.75,
    padding    = testNumber % 1; // padding == 0.75

答案 1 :(得分:2)

更简单:

var testNumber = 336.75;
var padding = testNumber % 1; // 0.75

修改
根据评论中的讨论,一个有趣的(也是令人讨厌的)问题是看到简单的浮点数学导致12位数的长结果。 例如,取2.3,我们希望从中获取0.3 2.3 % 1 = 0.299999999998 ......什么?!

另一个答案的解决方案也是如此:
2.3 - Math.floor(2.3) = 0.29999999998 .... :(

这似乎与浮点值的物理存储方式有关。 请查看此信息以获取更多信息: Is floating point math broken?

作为最终解决方案,您可以使用toFixed(n)

(2.3 % 1).toFixed(4); // "0.3000"

或者作为数字而不是字符串:

parseFloat((2.3 % 1).toFixed(4)); // 0.3

虽然合法地有超过4位小数的数字会丢失一点精确度:2.3456789 -> 2.3457