V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
sl0000
V2EX  ›  C++

boost::json 为什么要弄出 uint64 int64 double 这三种类型来表示 Number, json number 不是只有双精度浮点数这一种类型么?

  •  
  •   sl0000 · 263 天前 · 1744 次点击
    这是一个创建于 263 天前的主题,其中的信息可能已经有所发展或是发生改变。
    14 条回复    2021-02-01 13:24:29 +08:00
    icyalala
        1
    icyalala   263 天前
    JSON 标准并没有规定 Number 的类型。
    uint64 、int64 、double 表示的范围和精度都是不一样的。
    nightwitch
        2
    nightwitch   263 天前
    YouLMAO
        3
    YouLMAO   263 天前 via Android
    楼主是小年轻,没做过跨国项目,所以以为 JavaScript 代表全世界,JavaScript 用 double 存放 int64 会丢失精度,所以跨国项目 int64 在 JSON 里面都是 用双引号括起来数字,然后 JavaScript 使用高精度库函数处理,而 c 和 go 和 Java 使用默认 signed int64 处理
    BrettD
        4
    BrettD   263 天前 via iPhone
    JSON 不一定是 JavaScript 吧
    YouLMAO
        5
    YouLMAO   263 天前 via Android
    @BrettD json 跨国项目必须兼容世界语言,否则合约少了几张就是几亿美金(纯属虚构)
    Pastsong
        6
    Pastsong   263 天前 via Android
    @YouLMAO 这和跨国项目什么关系。。人家不是讨论规范吗?
    YouLMAO
        7
    YouLMAO   263 天前 via Android
    @Pastsong 规范就是没有规范,不是 1 楼很显然吗,不看贴回帖

    所以要讨论国际惯例

    必须要双引号括住 int64, 否则前端 JavaScript 解析 json 会丢失精度
    xcstream
        8
    xcstream   263 天前
    控制台 10000000000000000000+1 = 10000000000000000000
    DOLLOR
        9
    DOLLOR   262 天前
    跨语言交换 JSON 数据还是用 String 表示数字吧。
    甚至可以说,JSON 里的 Number,除了 js 自己用,其他语言别用。
    jim9606
        10
    jim9606   262 天前
    不是所有语言都像 Python 和 JS 那样内置自动适应的数值类型,基本上强类型语言都有内置支持。
    实际上这类强类型语言的 JSON 库都会提供多个函数输出数值类型,使用者需要自行保证不会出现溢出和预期之外的精度损失。
    通常认为 double 取值范围最大,但这是以损失部分精度为代价的,浮点精度损失问题是包括 JS 在内的所有语言都存在的问题,追求字面量精确的应该用字符串。
    jim9606
        11
    jim9606   262 天前
    打错了,强类型语言基本没有内置支持自动适应的数值类型
    YouLMAO
        12
    YouLMAO   262 天前 via Android
    @jim9606 表述错误,Python 是不会丢失精度的,而且 Python 有高精度整数,连 int128 都可以, 但 js 没有 int64,这是根本问题的最根本
    sl0000
        13
    sl0000   262 天前   ❤️ 1
    @YouLMAO '所以以为 JavaScript 代表全世界'

    不知道楼主哪来的偏见,我好像一句 js 都没有提到...
    BingoXuan
        14
    BingoXuan   262 天前 via Android
    json 是 ASCII 表示的,取决于序列化库的精度处理,Python 的 ujson 就有 float 精度问题,内置 json 就没有。对于机器来说,msgpack 是个好东西
    关于   ·   帮助文档   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1139 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 18ms · UTC 18:59 · PVG 02:59 · LAX 11:59 · JFK 14:59
    ♥ Do have faith in what you're doing.