【问题标题】:Storing info, if Number is Float or Integer存储信息,如果 Number 是 Fl​​oat 或 Integer
【发布时间】:2014-10-10 01:51:24
【问题描述】:

我有一个类似 JSON 的输入格式:

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

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

将其解析为经典对象很简单,但在编码时我需要区分浮点数和整数。我目前使用这种丑陋的 JS 结构:

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

我想简化我的结构。有什么方法可以区分 JS Numbers 中的 Floats 和 Integers 吗?像“免费位”之类的?或者也许是一些聪明的把戏?

例如如果我所有的输入数字总是正数,我可以将整数存储为正数,将浮点数存储为负数。但他们不是:(还有其他想法吗?

【问题讨论】:

标签: javascript floating-point


【解决方案1】:

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

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

2 % 1 === 0
> true

2.0 % 1 === 0
> false

但是,这仍然无法区分 0.00 之类的数字形式:

0 % 1 === 0
> true

0.0 % 1 === 0
> true

如果您的数字实际上存储为字符串,您可以简单地测试. 字符:

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

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

【讨论】:

  • 在字符串中存储数字是个好主意! :) 但遗憾的是,我的输入格式已经是 String 类型了……但也许我可以在开头使用附加字符。
  • @IvanKuckir 听起来好像您正在编写自定义解析器。如果是这种情况,您是否可以简单地摆脱 JavaScript 对数字文字的处理,并在解析输入时将 00.0 视为不同类型的值?
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

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

    {
        "a": "i2",
        "b": "f0",
        "c": "shi"
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-04-01
      • 2014-04-24
      • 2016-06-23
      • 2011-09-30
      • 2021-07-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多