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 · 2522 次点击
    这是一个创建于 1080 天前的主题,其中的信息可能已经有所发展或是发生改变。

    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)这种,参数不就是传的数字么
    DOLLOR
        6
    DOLLOR  
       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   ·   实用小工具   ·   5069 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 03:53 · PVG 11:53 · LAX 19:53 · JFK 22:53
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.