感觉我在这里遗漏了一些明显的东西。这已被多次询问 - 答案通常归结为:
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 1
和rgb 1 255 255
都将被解析为rgb 255 255 255
(因为我现在正在采取任何< = 1来表示比率)。
答案 0 :(得分:2)
这些数字实际上不是小数或整数。他们都是花车。 1
和1.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)
答案 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;
是一样的。你提到你想要从用户那里得到不同的对待。当它仍然是一个字符串并将其转换为适当的数字时,您将需要解析差异。