JavaScript - 如何将数字检测为十进制(包括1.0)

时间:2011-09-14 19:43:26

标签: javascript

感觉我在这里遗漏了一些明显的东西。这已被多次询问 - 答案通常归结为:

var num = 4.5;
num % 1 === 0; // false - 4.5 is a decimal

但是,

失败了
var num = 1.0; // or 2.0, 3.0, ...
num % 1 // 0

不幸的是,这些都不起作用

num.toString() // 1
typeof num // "number"

我正在编写一个JavaScript颜色解析库,如果它是1.0或1,我想以不同的方式处理输入。在我的例子中,1.0实际上意味着100%而1意味着1。

否则,rgb 1 1 1rgb 1 255 255都将被解析为rgb 255 255 255(因为我现在正在采取任何< = 1来表示比率)。

6 个答案:

答案 0 :(得分:2)

这些数字实际上不是小数或整数。他们都是花车。 11.0之间唯一真正的区别是用于创建相等值的浮点数的符号。

<小时/> 编辑:为了帮助说明,请考虑:

1 === 1.0; // true
parseInt('1') == parseInt('1.0'); // true
parseFloat('1') === parseFloat('1.0'); // true
parseInt('1') === parseFloat('1'); // true
// etc...

另外,为了证明它们实际上是相同的基础数据类型:

typeof(1); // 'number'
typeof(1.0); // 'number'

另外,请注意,“数字”在JavaScript中并不像在其他语言中那样明确,因为数字总是浮点数。

<小时/> 编辑2:还有一个补充,因为它是相关的。据我所知,JavaScript实际上具有“真实和真实”整数的唯一上下文并不是真正表示为浮点数,而是在进行按位运算时。但是,在这种情况下,解释器将所有浮点数转换为整数,执行操作,然后在返回控制之前将结果转换回浮点数。与这个问题并不完全相关,但它有助于很好地理解JS中的数字处理。

答案 1 :(得分:2)

让你的脚本将输入解析为字符串,然后检查是否存在这样的点。

mystring.indexOf('.');

检查this examplethis example

答案 2 :(得分:1)

解析字符串时你必须这样做。如果字符串中有小数点,则将其视为百分比,否则只是整数值。

所以,例如:

rgb 1 1 1   // same as #010101
rgb 1.0 1 1 // same as #ff0101

由于rgb存在,无论如何你正在解析字符串。在你做的时候,只需在那里寻找.

答案 3 :(得分:1)

Number.isInteger(4.5)

Number.isInteger() 是 ES6 标准的一部分,在 IE11 中不受支持。

答案 4 :(得分:0)

嗯,就编译器而言,1.0和1之间没有区别,因为没有区别,所以不可能区分它们。对于百分比,您应该将其从1.0更改为100。这可能会解决它。

答案 5 :(得分:0)

var num = 1;

var num = 1.0;

是一样的。你提到你想要从用户那里得到不同的对待。当它仍然是一个字符串并将其转换为适当的数字时,您将需要解析差异。