如果Number为Float或Integer,则存储信息

时间:2014-08-16 15:07:50

标签: javascript floating-point

我有类似JSON的输入格式:

{
    "a": 2,
    "b": 0.0,
    "c": "hi"
}

有浮点值(始终带小数点)和整数值(无小数点)。我需要使用Javascript解析它,使用它然后将其写回文件(带小数点的浮点数)。

直接将它解析为经典对象,但我需要在编码时区分Floats和Integers。我目前使用这个丑陋的JS结构:

{
    type: "Object",
    value: {
        a: {type: "Integer", value: 2},
        b: {type: "Float"  , value: 0},
        c: {type: "String" , value: "hi"}
    }
}

我想简化我的结构。有没有办法区分JS数字中的Floats和Integers?喜欢"免费比特"或者其他的东西?或者也许是一些聪明的把戏

E.g。如果我的所有输入数字都是正数,我可以将整数存储为正数,将浮点数存储为负数。但他们不是:(任何其他想法?

3 个答案:

答案 0 :(得分:1)

在JavaScript中,所有数字都以64位浮点形式在内部表示。 JavaScript中只有floatinteger没有这样的东西,只有Number。因此,如果您想将信息传递给另一个系统,关于这是否是floatinteger,您必须在其他地方对其进行编码,类似于您已有的结构。

在JavaScript中无法检测数字文字是否用小数部分表示。你可以得到的最接近的是测试一个数字是否有一个小数部分。使用模运算符(%)很容易做到:

2 % 1 === 0
> true

2.0 % 1 === 0
> false

但是,这仍然无法区分0.0等数字表单与0

0 % 1 === 0
> true

0.0 % 1 === 0
> true

如果您的数字实际上存储为字符串,则只需测试.字符:

"0".indexOf(".") === -1
> true

"0.0".indexOf(".") === -1
> false

答案 1 :(得分:0)

您可以使用parseInt或模运算符,并执行一些花哨的技巧,例如

if (parseInt(n) === n)
    console.log("Integer");
else
    console.log("Float");

if (n % 1 === 0)
    console.log("Integer");
else
    console.log("Float");

答案 2 :(得分:0)

我最终决定将数字保存为字符串并使用第一个字符来区分它们(i:integer,f:float,s:string)。访问值时我将不得不进行额外的解析。

{
    "a": "i2",
    "b": "f0",
    "c": "shi"
}
相关问题