js 科学计数法问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a Javascript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
Javascript 权威指南第 5 版
Closure: The Definitive Guide
leebs
V2EX    Javascript

js 科学计数法问题

  •  
  •   leebs 2022-01-10 13:37:37 +08:00 3069 次点击
    这是一个创建于 1437 天前的主题,其中的信息可能已经有所发展或是发生改变。

    js 小于 1 的数字,精度超过 6 位会自动转成科学计数法表示,如 0.0000001 ,会自动转成 1e-7 。

    现在可以通过 1e-7.toFixed(7) 方法转成字符串,得到 '0.0000001'。

    问题是能否用数字形式表示 0.0000001 ,而非科学计数法?

    其他语言也有这个问题嘛?

    15 条回复    2022-01-11 12:59:15 +08:00
    registerrr
        1
    registerrr  
       2022-01-10 13:47:29 +08:00
    很多语言里有 printf ,可以满足你的要求
    leebs
        2
    leebs  
    OP
       2022-01-10 13:49:33 +08:00
    @registerrr 这个输出还是字符串吧,能否输出数字呢。
    marcong95
        3
    marcong95  
       2022-01-10 13:53:48 +08:00   3
    不能,因为小数在内存里本身就是有以科学计数法保存的。详见 IEEE 754 ,你以为的 1e-7 其实是

    0.0000000999999999999999954748111825886258685613938723690807819366455078125

    执行 (1e-7).toFixed(100).replace(/\.?0+$/, '') 可得

    IEEE 754 相关话题感觉都成月经贴了
    thinkershare
        4
    thinkershare  
       2022-01-10 13:56:34 +08:00
    你要先搞清楚, 你看得到的都是字符串, 没有数字, 数字层面只要 0101001, 至于你要怎么解释, 是数据类型的事情, 你看到的打印的都是各种 toString()格式化决定的, JS 使用的是 IEEE 754, 这个规范的 ToString 在小数位无效的时候, 大部分语言都选择使用科学计数法来作为字符串格式化形式, 即只有 6,7 位的有效位, 其它有效位是无效的, 因为表示整数的部分位数不够多, 精度不够
    registerrr
        5
    registerrr  
       2022-01-10 13:58:43 +08:00
    @leebs 都显示到屏幕上了,还有所谓的字符串或者数字之分么。像 printf(%.1f,5.43478)这种,参数不就是传的数字么
    AV1
        6
    AV1  
       2022-01-10 14:00:19 +08:00
    你需要了解一下浮点数在计算机里的表示形式。
    codeduan
        7
    codeduan  
       2022-01-10 14:09:02 +08:00
    什么时候需要数字形式表示 0.0000001 呢?如果是展示需要的话,用 toFixed 就行了吧。
    thinkershare
        8
    thinkershare  
       2022-01-10 15:59:49 +08:00
    你可以找一门语言的 toString()实现去看看, 底层就是拼接 0-9,.这些 char 字符, 然后组成一个 string 返回给你, 给你一个链接可以去看看, [dotnet 5 double ToString()实现]( https://github.com/dotnet/runtime/blob/af4efb1936b407ca5f4576e81484cf5687b79a26/src/libraries/System.Private.CoreLib/src/System/Number.Formatting.cs#L382)
    thinkershare
        9
    thinkershare  
       2022-01-10 16:02:00 +08:00
    计算机底层没有什么魔法, 都是一些超级简单而且笨拙的组合
    leebs
        10
    leebs  
    OP
       2022-01-10 16:26:41 +08:00
    科学计数法转字符串有什么现有的方法嘛?
    1.123e-10 => 0.0000000001123
    vone
        11
    vone  
       2022-01-10 17:17:01 +08:00
    @leebs https://github.com/MikeMcl/decimal.js/

    const x = new Decimal(0.0000000001123)
    x.toFixed() // '0.0000000001123'
    agagega
        12
    agagega  
       2022-01-10 18:21:50 +08:00 via iPhone
    你这个要求只能用 Decimal
    IvanLi127
        13
    IvanLi127  
       2022-01-10 23:23:46 +08:00 via Android
    能,改你用来显示这数字的程序逻辑,让它按你的想法去把你不能看见的数值转换成你想看到的 0.00000001 字符串,并且和之前表示 1e-7 一样,不去显示两边的引号。
    2i2Re2PLMaDnghL
        14
    2i2Re2PLMaDnghL  
       2022-01-11 09:56:29 +08:00
    我觉得你完全没理解,或者遇上了 X-Y 问题。

    如果你没理解,请再看一遍 #3
    实际上计算机内部既不是 0.0000001 也不是 1e-7
    参考 new Uint32Array(new Float32Array([1e-7]).buffer)
    结果是 [ 869711765 ],即 0x33D6BF95
    (1+1/4+1/16+1/64+1/128+1/256+1/512+1/4096+1/8192+1/131072+1/262144+1/524288+1/2097152+1/4194304+1/8388608)*2^(103 - 127)
    = 14073749/140737488355328
    = 1.0000000116860974230803549289703369140625 × 10^-7

    如果遇上了 X-Y 问题,请直接描述你想要的问题。
    Jooooooooo
        15
    Jooooooooo  
       2022-01-11 12:59:15 +08:00
    计算机只能表达 1 和 0
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2920 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 14:47 PVG 22:47 LAX 06:47 JFK 09:47
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86